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);
Last Updated 2024/3/14 09:51:53