Jsonwebtoken
yuhuo2022-02-21开发库NodeJs库
用户认证方案
session
服务器认证后通过 session 保存当前用户信息,并通过 cookie 将 session_id 保存在客户端中。
后续每次请求时自动携带 cookie,服务器通过 session_id 获取 session 中的用户信息。
缺点
- 跨域时读取不到cookie;
- session 数据无法在服务器集群之间共享(除非存到数据库);
JWT
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
服务器认证后将当前用户信息打包生成 token 字符串,并通过接口返回,保存在客户端的 cookie 或 localStorage 中。
后续每次请求时手动在请求头中携带 token,服务器解析 token 获取用户信息,并通过 Signature 验证有效性。
Authorization: Bearer <token>
优点
- 通过请求头发送 token 不会跨域;
- 服务器无须保存 session 数据,无状态,易于扩展;
缺点
- token 无加密,Payload 中不能保存私密信息;
- 使用中无法废止或更改某个 token,即一旦签发,到期之前始终有效;
token 数据结构
Header.Payload.Signature
,示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAwMSwiaWF0IjoxNjc2OTY5OTk2fQ.SR6U7ygJJZXJcDkawyGKt6udMHlKpIXmi7EkOuRvNWc
Header 用于描述 JWT 的元数据,再通过 Base64URL 算法将 json 转成字符串。
{
"alg": "HS256", // 签名算法,默认:HS256(即 HMAC SHA256 算法)
"typ": "JWT" // 令牌类型,JWT令牌统一为:JWT
}
Payload 存放实际需要传递的数据,再通过 Base64URL 算法将 json 转成字符串。
// 官方定义的7个字段,也可以自定义
{
"iss": "", // issuer 签发人
"exp": "", // expiration time 过期时间
"sub": "", // subject 主题
"aud": "", // audience 受众
"nbf": "", // Not Before 生效时间
"iat": "", // Issued At 签发时间
"jti": "", // JWT ID 编号
}
Signature 是使用 Header 里指定的签名算法,对 Header 和 Payload 加上秘钥进行签名生成的字符串,用于防止数据篡改。
Jsonwebtoken
安装
npm install jsonwebtoken
运行
const jwt = require("jsonwebtoken");
const secret = "秘钥";
// 生成token
// jwt.sign(payload: object | string, secret: string, options?: object): string
var token = jwt.sign("用户信息", secret);
var token = jwt.sign({ foo: "bar" }, secret, { algorithm: "HS256" });
// 解析token
// jwt.verify(token: string, secret: string): object | string
var payload = jwt.verify(token, secret);