前言
在一个 Web 应用中,用户登录认证是必不可少的。传统的登录认证方式需要把用户信息存储在 Session 中,但是 Session 有很多问题,比如 Session 的存储在高并发情况下带来的问题,以及 Session 共享的问题等等。在这个时候,JSON Web Token(JWT)应运而生,它是一种基于 Token 的认证机制,可以解决传统 Session 的一些问题,预计会有更加广泛的应用。
JWT 简介
JWT 是一种 JSON 格式的 Token,由三部分组成,分别是 Header、Payload 和 Signature。其中,Header 包含了 Token 的元信息,如算法类型等;Payload 包含了 Token 的内容,比如用户的 ID、用户名等;Signature 是对 Header 和 Payload 加密后得到的签名。一个 JWT 的示例如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------------
实现 Node.js 中的 JWT 用户登录认证
1. 前端代码
在前端代码中,需要将用户名和密码发送到后端,然后在获取到后端返回的 JWT 后,将其存储到本地存储中以备后续使用。代码实现如下:
----- ----- - -- -- - ----- -------- - ----------------------------------------- ----- -------- - ----------------------------------------- --------------- - ------- ------- -------- - --------------- ------------------ -- ----- ---------------- --------- -------- -- ----------- -- ----------- ---------- -- - ----------------------------- ----------- -- -------- -- ---------- -- - -- -------- -- -
2. 后端代码
在后端代码中,需要进行用户登录认证,并返回 JWT,如果认证失败则返回相应的错误信息。代码实现如下:
----- --- - ----------------------- ----- ------- - ------------------ ----- --- - --------- ----- ------ - --------------- ----------------------- ------------------ ----- ---- -- - ----- - --------- -------- - - -------- -- ----- -------- -- --------- --- ------- -- -------- --- --------- - ----- ----- - ---------- -------- -- ------- - ---------- ---- -- ---------- ----- -- - ---- - ---------------------- ------ ---------- -- - -- ------------------- ----- ---- -- - ----- ----- - --------------------------------- ----- ----- ------- - ----------------- ------- ----- - -------- - - ------- -- ----- ----------- ---------- -------- -- -- ---------------- -- -- ------------------- -- ----------
在上面的代码中,我们使用了 jsonwebtoken
模块来实现 JWT 的生成和验证功能。在 /login
接口中,当用户名和密码正确时,我们通过调用 jwt.sign()
方法生成 JWT,并将其返回给前端。在 /profile
接口中,我们通过调用 jwt.verify()
方法来对 JWT 进行验证,并将解码后的内容返回给前端。
3. 中间件的实现
为了方便使用,我们可以将 JWT 验证过程封装到中间件中,从而在需要的路由中使用。中间件的实现代码如下:
----- --- - ----------------------- ----- ------ - --------------- ----- ---- - ----- ---- ----- -- - ----- ----- - --------------------------------- ----- --- - ----- ------- - ----------------- ------- -------- - ------- ------ - ----- ----- - ---------------------- ------ ---- ------ -- - - -------------- - ----
在上面的代码中,我们定义了一个名为 auth
的中间件。在这个中间件中,我们通过 jwt.verify()
方法来对 JWT 进行验证,如果验证通过,则将解码后的用户信息存储到 req.user
中,并调用 next()
方法继续执行后续代码;如果验证失败,则返回 401
状态码和相应的错误信息。
4. 使用中间件进行路由保护
在有些情况下,我们需要对某些路由进行保护,只有在用户登录成功后才能访问。使用我们之前定义的 auth
中间件,即可轻松实现这个功能。示例代码如下:
----- ------- - ------------------ ----- ---- - ----------------- ----- --- - --------- ------------------- ----- ----- ---- -- - ----- - -------- - - -------- -- ----- ----------- ---------- -------- -- -- ---------------- -- -- ------------------- -- ----------
在上面的代码中,我们使用了 auth
中间件来保护 /profile
路由,只有在用户登录成功并附带有效的 JWT 时才能访问。
总结
通过本文的学习,我们了解了 JWT 的基本概念和用法,以及在 Node.js 中实现 JWT 用户登录认证的具体步骤。同时,我们还封装了中间件来进行路由保护,以提高应用的安全性。希望本文对大家学习前端技术有所帮助。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64c1fad883d39b488161d7b3