TS 使用 JWT
最近一个项目需要用到 JWT,去学了一下在 TS 中使用 JWT,记录一下。
JWT
JWT 是一种用于双方之间传递安全信息的简洁的、URL 安全的表述性声明规范。(废话)
JWT 全称 JSON Web Tokens
JWT 由三部分组成,分别是 Header、Payload、Signature。总体是一个格式为 xxxxx.yyyyy.zzzzz
字符串
header 存了加密算法,payload 存了用户信息,signature 是对前两者的签名。
header 和 payload 都是 json 对象,经过 base64 编码,然后用.
连接起来,最后用密钥签名。
你可以在JWT 官网上解析一个 JWT。
也就是说,用户是可以看到 header 和 payload 的。
服务端用密钥对 header 和 payload 进行签名,然后把签名后的字符串发给用户。
用户在请求服务端的时候,把这个字符串带上,服务端用密钥对这个字符串进行签名,然后和用户发来的签名进行比对,如果一致,说明用户没有修改过,就可以信任这个用户。
真是一种巧妙的方法,保证安全的同时,又不用在服务端存储用户信息。
使用
安装依赖
bash
npm install jsonwebtoken @types/jsonwebtoken
生成与验证
ts
// 导入jsonwebtoken
import jwt from "jsonwebtoken";
// 保存在服务端的密钥
const privatey = "1145141919810";
// 用户下北泽登录
let data = {
user: "下北泽",
};
let token = jwt.sign(
data, // 用户信息,放在payload中
privatey, // 密钥
{
// 配置
expiresIn: "1h", // 有效期1小时
}
);
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTAwMDAwMTIiLCJpYXQiOjE2OTQwNDc0NzgsImV4cCI6MTY5NDIyMDI3OH0.Itc9w1NC-n0GvorIhaMzNy6ZcnBCOJ1MqJTj0rsr12s
// 发送给客户端
// code...
// 客户端发送的token
let token2 = "...";
// 服务端验证
try {
// 获取解析后的对象,如果token不合法,会抛出异常
var data = jwt.verify(token, privatey);
} catch (err) {
// err
}
// 直接可以访问
console.log(data.user); // 下北泽