Skip to content

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); // 下北泽

参考资料

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1