在 RESTful API 开发中,身份验证是一个非常关键的部分。传统的身份验证方法,如使用用户名和密码,会暴露用户敏感信息的风险。JSON Web Token(JWT)是一种新的身份验证方法,可以解决这个问题,同时还能提高 API 安全性和性能。
什么是 JSON Web Token?
JSON Web Token(JWT)是一种轻量级的安全性传输协议,用于在客户端和服务器端之间传递信息。JWT 是由三个部分组成的字符串,分别是 Header、Payload 和 Signature。
Header
Header 包含 JWT 使用的签名算法,如 HMAC SHA256 或 RSA。Header 通常采用以下格式:
{ "alg": "HS256", "typ": "JWT" }
Payload
Payload 包含有关身份验证的信息,如用户 ID、姓名和角色。Payload 也可以包含其他有用的信息,如到期时间和请求权限等。Payload 通常采用以下格式:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Signature
Signature 是将 Header 和 Payload 连接在一起,使用所选算法签名得到的字符串。Signature 用于验证 JWT 的有效性。Signature 通常采用以下格式:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
如何使用 JWT?
生成 JWT
在客户端进行身份验证时,我们需要生成 JWT 并将其发送到服务器。生成 JWT 要涉及到以下步骤:
- 创建 Header 和 Payload。
- 使用 Header 和 Payload,加上一个密钥,生成 Signature。
- 将 Header、Payload 和 Signature 串联在一起,形成 JWT。
在 JavaScript 中,可以使用 jsonwebtoken 库生成 JWT。示例代码如下:
-- -------------------- ---- ------- ----- --- - ------------------------ -- -- ------ - ------- ----- ------ - - ---- -------- ---- ----- -- ----- ------- - - ---- ------------- ----- ----- ----- ---- ---------- -- -- ------ --------- ----- ------ - ------------ ----- --------- - ---------- ------- ------- -- ------- - ---------- ------- --- -----------------------
这将输出以下字符串:
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9.O8scwwiYK25XGnNggUPQFHz8ph-OZM5K5d5GE5diMv0
在 RESTful API 中使用 JWT
在服务器端接收到 JWT 后,我们需要验证其有效性,并根据其中包含的信息来处理请求。验证 JWT 要涉及以下步骤:
- 从请求头中获取 JWT。
- 使用密钥验证 JWT 的 Signature。
- 检查 JWT 是否过期。
- 解码 Payload 并提取有用的信息。
- 根据提取的信息处理请求。
在 Node.js 中,可以使用 express-jwt 中间件进行 JWT 验证。示例代码如下:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ----------------------- ----- --- - ---------- -- -- --- ----- ----- ------ - ------------ ------------- ------ ----------- ----- ---------- ---- -- ---- --------------------- ----- ---- -- - ----- - ---- ---- - - --------- -- ---- -- --------- ----- ----- - ---- ---------------- --- ----------------------- ----- ---- -- - ----- - --- - - --------- -- ---- -- --------- ----- ----- - ---- ---------------- --- -- ---- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- -- -------------- --- ----- ---- - - ---- ------------- ----- ----- ---- -- ----- ----- - ---------- ---- -- ------- - ---------- ------- --- ---------- ----- --- --- -----------------
在这个示例中,我们使用 express-jwt
中间件验证 JWT,并在路由中访问 req.user
对象来访问 JWT Payload 中的信息。unless
方法允许我们排除一些路径不进行身份验证。同时,我们提供了一个登录路由,用于生成并发送 JWT。
总结
JSON Web Token(JWT)是一种新的身份验证方法,可以提高 API 安全性和性能。使用 JWT,我们可以在客户端和服务器端之间传递信息,同时还能保护用户敏感信息的安全性。希望本文对你在 RESTful API 开发中使用 JWT 有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652f9b637d4982a6eb0c7ac9