随着互联网的不断发展,网站的用户量也越来越庞大。为了保护用户的账号安全,网站需要实现身份验证。JWT(JSON Web Token)是一种无状态的身份验证方法,具有高效、跨域、可扩展等优点。本篇文章将介绍使用 React 和 Redux 实现 JWT 身份验证的方式。
前置知识
在阅读本篇文章前,需要具备以下知识:
- React 的基本使用方法
- Redux 的基本使用方法
- JWT 的基本概念和使用方法
如果你对以上知识不熟悉,可以先学习一下相关的教程。
实现步骤
接下来,我们将详细介绍使用 React 和 Redux 实现 JWT 身份验证的步骤。
1. 登录界面
首先,我们需要设计一个登录界面,用户可以在该界面输入用户名和密码,然后通过 Ajax 提交给后台进行验证。如果用户名和密码正确,后台将返回一个包含 JWT 的响应。我们需要将该 JWT 存储在客户端本地存储中,以便后续使用。
-- -------------------- ---- ------- ------ ------ - --------- - ---- -------- ------ ----- ---- -------- ----- ----- ------- --------- - ------------------ - ------------- ---------- - - --------- --- --------- -- -- ----------------- - ----------------------------- ----------------- - ----------------------------- - ------------------- - ----------------------- ----- - --------- -------- - - ----------- ------------------------ - --------- -------- -- -------------- -- - --------------------------- --------------------- -------------------------------------- -- ------------ -- - ------------------- --- - ------------------- - ----- - ----- ----- - - ------------- --------------- ------- ----- --- - -------- - ----- - --------- -------- - - ----------- ------ - ----- ----------------------------- ----- ------ ------------------------------------ ------ ----------- ------------- --------------- ---------------- ---------------------------- -- ------ ----- ------ ------------------------------------ ------ --------------- ------------- --------------- ---------------- ---------------------------- -- ------ ------- ---------------------------- ------- -- - - ------ ------- ------
在上面的代码中,我们使用了 axios 进行 Ajax 请求,并将返回的 JWT 存储在 localStorage 中。localStorage 是客户端从浏览器存储并读取数据的 API,它提供了一种方便存储小型数据的方式。
2. 后续请求
在用户完成登录后,我们需要对所有后续的请求进行 JWT 认证,以确保用户是合法的。为此,我们需要在客户端发送请求时,在请求头中传递 JWT。在服务器端,我们需要验证该 JWT 是否合法,并在响应中返回相应数据。
-- -------------------- ---- ------- ------ ----- ---- -------- ----- ------------- - -- -- - ----- ----- - ---------------------------- -- ------- - ------ -------------- -------- - ---------------- ------- ---------- -- --- - ---- - ----- --- --------- ----- -------- - -- ------ ------- --------------
在上面的代码中,我们定义了一个名为 axiosWithAuth 的函数,它会在请求头中带上 JWT,使得所有请求都能够通过 JWT 认证。如果客户端没有存储 JWT,则该函数会抛出一个错误。
3. 鉴权中间件
在服务器端,我们需要编写一个中间件来验证 JWT 的合法性。该中间件会对客户端发送的带有 JWT 的请求进行验证,如果 JWT 不合法,则返回一个 401 响应。
-- -------------------- ---- ------- ----- --- - ------------------------ ----- -------------- - ----- ---- ----- -- - ----- ----- - -------------------------- -- -------- - ------ ------------------------ ----- -------- - --- - ----- ------- - ------------------------ ------ ---------- -------- - -------- ------- - ----- ------- - ------ ----------------------------- -------- - -- -------------- - ---------------
在上面的代码中,我们使用了 jwt 模块来进行 JWT 的验证,如果 JWT 不合法,或者已经过期,则该模块会抛出一个错误。
4. Redux 状态管理
在使用 JWT 进行身份验证时,我们的应用程序状态需要管理当前用户是否已经登录,以及当前用户的信息。为此,我们可以使用 Redux 来进行状态管理。
在 Redux 中,我们需要设计多个 reducer,来管理不同的状态。在这里,我们可以设计两个 reducer,一个用来管理当前用户是否已经登录的状态,另一个用来管理当前用户的信息的状态。
-- -------------------- ---- ------- -- -------------- ----- ------------ - - ---------------- ------ ----- --- -- ----- ----------- - ------ - ------------- ------- -- - ------ ------------- - ---- ------------- ------ - ---------------- ----- ----- --------------- -- ---- -------------- ------ - ---------------- ------ ----- --- -- -------- ------ ------ - -- ------ ------- ------------
在上面的代码中,我们定义了一个名为 authReducer 的 reducer,它的初始状态为 isAuthenticated 为 false,user 为空对象。当用户成功登录时,我们会通过 AUTH_LOGIN action 将 isAuthenticated 设置为 true,user 设置为包含用户信息的对象。当用户注销登录时,我们会通过 AUTH_LOGOUT action 将 isAuthenticated 设置为 false,user 设置为空对象。
-- -------------------- ---- ------- -- -------------- ----- ------------ - - ----- --- ---- -- -- ----- ----------- - ------ - ------------- ------- -- - ------ ------------- - ---- -------------- ------ --------------- -------- ------ ------ - -- ------ ------- ------------
在上面的代码中,我们定义了一个名为 userReducer 的 reducer,它的初始状态为一个包含 name 和 age 的对象,都为初始值。当我们需要更新用户信息时,我们会通过 USER_UPDATE action 将整个用户信息对象作为 payload 传入 reducer 中。
5. 组件设计
最后,我们需要设计一个包含登录界面和控制台界面的组件。当用户成功登录后,该组件将显示控制台界面,否则将显示登录界面。
-- -------------------- ---- ------- ------ ----- ---- -------- ------ - ------- ------ -------- - ---- ------------------- ------ - ------- - ---- -------------- ------ ----- ---- ---------- ------ --------- ---- -------------- ----- ------------ - -- ---------------- ---------- ---------- ------- -- -- - ------ --------- --------------- -- - --------------- - ---------- ---------- -- - --------- ----------- -- -- -- -- ----- --- - -- --------------- -- -- - ----- -------- ------ ------------- ----------------- -- ------------- ----------------- --------------------- --------------------------------- -- --------- ------ -- ----- --------------- - ----- -- -- ---------------- --------------------------- --- ------ ------- ------------------------------
在上面的代码中,我们使用了 React Router 来实现路由的功能。PrivateRoute 是一个自定义组件,它会根据当前用户是否已经登录来决定是否显示控制台界面。如果用户已经登录,则通过 isAuthenticated 属性来控制显示,否则重定向到登录界面。
总结
本篇文章介绍了使用 React 和 Redux 实现 JWT 身份验证的方法。我们首先设计了一个登录界面,用来接收用户的用户名和密码,并将 JWT 存储在客户端本地存储中。接着,我们设计了一个 axiosWithAuth 函数,它会在客户端发送请求时,在请求头中带上 JWT。在服务器端,我们编写了一个中间件来对带有 JWT 的请求进行验证,并返回相应的数据。最后,我们使用了 Redux 来进行状态管理,以管理当前用户的登录状态和信息。
使用 JWT 进行身份验证是一种高效、跨域、可扩展的方法,可以适用于大多数 Web 应用程序。如果你正在开发一个 Web 应用程序,并且想要实现身份验证功能,可以考虑使用本文介绍的方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646f2544968c7c53b0d8a26a