安装jsonwebtoken
npm i jsonwebtoken
时间戳转换网站
https://tool.lu/timestamp
Base64 解码网站
https://base64.us
Jwt 解码网站
https://jwt.io
jwt(JSON Web Token) 是一种基于令牌(Token)的认证和授权机制
JWT由三部分组成 Header(头部)、 Payload(负载)、 Signature(签名)
Header(头部)
{
"alg": "HS256", //algorithm 算法
"typ": "JWT" //type 类型
}
Payload(负载)
{
"sub": 1, //Subject 主题 (用户唯一id)
"iss": "dengruicode.com", //Issuer 发行者
"iat": 1719930255, //Issued At 发行时间
"nbf": 1719930255, //Not Before 生效时间
"exp": 1720016655, //Expiration Time 过期时间
"aud": [ //Audience 观众字段为空,表示没有观众限制,可以被任何接收方处理
""
],
"data": { //自定义数据
"name": "邓瑞",
"gender": "男"
}
}
Signature(签名[用于验证 jwt 的完整性和防篡改])
HMACSHA256(
base64UrlEncode(Header) + "." +
base64UrlEncode(Payload),
密钥
)
import Koa from 'koa'
import Router from '@koa/router'
import JWT from 'jsonwebtoken'
const hostname = "127.0.0.1"
const port = 8008
const app = new Koa()
const router = new Router() //实例化一个 Router 对象
router.get('/', async ctx => {
let key = 'koaTest' //密钥
let token = generateToken(key) //生成token
parseToken(token, key) //解析token
ctx.body = token
})
app.use(router.routes()) //将定义在 router 对象中的路由规则添加到 app 实例中
//生成token
let generateToken = key => {
let id = 1 //用户唯一id
let now = Math.floor(Date.now() / 1000) //当前时间戳 单位:秒
let expire = 24 * 60 * 60
//负载
let payload = {
sub: id, //Subject 主题 (用户唯一id)
iss: 'dengruicode.com', //Issuer 发行者
iat: now, //Issued At 发行时间
nbf: now, //Not Before 生效时间
exp: now + expire, //Expiration Time 过期时间
aud: [''], //Audience 观众字段为空,表示没有观众限制,可以被任何接收方处理
data: { //自定义数据
name: '邓瑞',
gender: '男',
}
}
//使用负载(payload)、密钥(key)和指定的签名算法(HS256)生成token
let token = JWT.sign(payload, key, { algorithm: 'HS256' })
return token
}
//解析token
let parseToken = (token, key) => {
let payload = JWT.verify(token, key, { algorithm: 'HS256' })
console.log('解析后的payload:', payload)
}
app.listen(port, hostname, () => {
console.log(`服务器已启动: http://${hostname}:${port}`)
})