随着前端技术的发展,越来越多的应用开始采用前后端分离的架构,前端应用需要与后端 API 交互来获取数据。而在这个过程中,身份验证和访问控制是一个很重要的问题。JSON Web Tokens(JWT)是一个轻便而安全的方法,它可以在前端和后端之间传递验证信息,同时避免了会话的状态管理问题。
什么是 JSON Web Tokens
JSON Web Tokens 是一种开放标准(RFC 7519),它定义了一种紧凑、自包含的、URL 安全的方式来传输信息。JWT 是一种基于 JSON 编码的 token,它包含了一些声明,这些声明描述了被授权的实体(通常是用户)以及被授权的访问。JWT 可以使用 HMAC 算法或者公钥/私钥对签名,从而保持其完整性。
一个 JWT token 包含了三个部分,它们分别是:
- Header:包含 token 的类型和所使用的算法。
- Payload:包含声明(claims)信息,其中根据需要可以自定义很多声明。
- Signature:对前两部分经过哈希后的结果进行签名。
这里是一个 JWT 的典型样例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
其中,Header 和 Payload 部分都使用 Base64Url 编码,而 Signature 部分则是使用特定算法计算得到的哈希值。
如何使用 JWT 实现用户认证
在 Node.js 中使用 JWT 实现用户认证非常简单,这里我们采用 jsonwebtoken 这个第三方库。首先,在 Node 项目中安装该库:
npm install jsonwebtoken
接下来,我们写一个用户登录的 API,在用户验证通过后生成 JWT token 并返回给客户端:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- --- - ---------- -- ------ ------------------ ----- ---- -- - ----- - --------- -------- - - --------- -- ------------- -- ---------- --- ----- ------- ----- ------- - - -------- -- -- ----------- ------- -- ----- --------- - ------------------ -- --------------- ----- ----- - ----------------- ----------- ---------- ----- --- ---
上述代码中,我们首先从请求中获取用户名和密码等信息,然后进行验证。如果验证通过,我们就可以根据用户的信息生成一个 payload 对象,并调用 jsonwebtoken 的 sign 方法生成 JWT token。注意,这里的 secretKey 是用于签名的密钥,请根据需要进行更改。
接下来,让我们看一下如何在每个请求中进行用户认证:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- --- - ---------- -- ------------------ ----- -- -------- ---------------- ---- ----- - ----- ------------------- - -------------------------- -- ---------------------- - ------ ----------------------------------- - ----- ----- - --------------------------- ------ ----- --------- - ------------------ -- ------ ----- ------ --- - ----- ------- - ----------------- ----------- -------- - -------- ------- - ----- ----- - ------ ------------------------------------- - - -- ----------- ------------------- ------------ ----- ---- -- - -- -------------- --------- -- ------------------- ---
上述代码中,我们定义了一个中间件函数 verifyToken,该函数用于验证用户是否已经登录,并根据 token 的有效性判断用户是否具有访问页面的权限。在该函数中,我们首先从请求头中获取 Authorization 字段,并解析出其中的 JWT token。然后,我们调用 jsonwebtoken 的 verify 方法对 token 进行验证。如果 token 被篡改或者已经过期,则会抛出异常,此时我们就认为用户未通过验证,返回 401 错误。
最后,我们可以在需要进行身份验证的路由中使用 verifyToken 中间件,如果用户通过验证,则继续执行后续代码。
总结
在 Node.js 中使用 JWT 实现用户认证是一个非常方便的方法,它既安全又灵活,可以绕过会话状态管理的固有问题。在实际应用中,我们应该根据具体的需求来使用 jwt.sign 和 jwt.verify 方法,并采取一些基本的措施来确保密钥的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ca06355ad90b6d041910eb