什么是 JWT?
JWT(JSON Web Token)是一种轻量级的认证和授权机制,由 JSON 数据构成,使用签名来保证传输过程中的安全性。JWT 包含一个头部、一个载荷和一个签名。头部包含算法和类型信息,载荷包含用户的信息和其他的元数据,签名则对头部和载荷进行加密生成。
为何需要 JWT?
在 RESTful API 中,有些资源请求是只允许授权用户访问的。然而,HTTP 协议是一个无状态的协议,每个请求都是独立的,所以我们需要一种机制来标识请求是否来自于一个经过身份验证的用户。
传统的身份验证机制包括 cookie 和 session,同时也有一些第三方认证机构(如 OAuth)可以供我们使用。但是这些机制都有一些限制,如:
- Cookie 和 session 需要在服务端维护用户状态,增加了服务端的负担并不便于扩展。
- 第三方认证机构需要在服务端配置接入信息,不便于管理。
相比之下,JWT 更加适合 RESTful API 的身份认证,因为它能够在客户端存储用户身份信息,不依赖于服务端的状态维护,且具备良好的扩展性和可移植性。
如何使用 JWT?
生成 JWT
使用 node.js 的 jsonwebtoken 模块可以方便地生成和验证 JWT。首先需要安装 jsonwebtoken 模块:
npm install jsonwebtoken
然后在代码中使用 jsonwebtoken.sign
方法生成 JWT:
const jwt = require('jsonwebtoken'); const payload = { username: 'test' }; const secretKey = 'your-secret-key'; const token = jwt.sign(payload, secretKey); console.log(token);
其中,payload
包含了需要传递的用户信息,secretKey
是一个用于对 JWT 进行签名的字符串。token 就是生成的 JWT 内容。
验证 JWT
当用户发送请求时,需要在请求头中添加 JWT,例如:
Authorization: Bearer <token>
服务端可以使用 jsonwebtoken.verify
方法来验证 JWT 是否有效。例如:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ----- - --------------------------------- ------ ----- --------- - ------------------ --- - ----- ------- - ----------------- ----------- --------------------- - ----- ----- - ----------------- -
其中,jwt.verify
方法会检查 JWT 的签名和有效期,如果验证成功,解码后的内容会存储在 decoded
中。
总结
JWT 是一种轻量级的认证和授权机制,适合 RESTful API 的身份认证。使用 JWT 可以减轻服务端的负担,同时提高可扩展性和可移植性。在实际使用中,需要注意 JWT 的签名和有效期,同时也需要考虑 JWT 的存储和传输方式。
示例代码见:https://github.com/liuzemei/frontend-example/tree/master/jwt
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64dce4c1f6b2d6eab37f64d2