关于JWT的学习笔记
const crypto = require('crypto')
// @渡一Web前端学习频道 2023.05.01
// JWT(JSON Web Token) 的本质是一个非常长的字符串
// 这个字符串有三个部分组成: header.payload.signature
// header: { "alg": "HS256", "typ": "JWT" } 基本上是固定的写法
// payload: { "name": "username", "age": 18 } 服务器想传递给客户端的信息(身份信息、JWT过期时间等)
// signature: 对 header 和 payload 通过 . 连接, 调用加密算法生成签名, 再转化成 base64 格式
// btoa() 对字符串进行 base64 编码
// atob() 对字符串进行 base64 解码
function sign(info, key) {
// 调用crypto模块中的createHmac方法,通过sha256算法对秘钥进行哈希化
const hmac = crypto.createHmac('sha256', key)
// 哈希之后,添加明文 info
hmac.update(info)
// digest: 将之后的内容进行十六进制的消化吸收
const signResult = hmac.digest('hex')
return signResult
}
function JWT(info, key) {
const header = {
typ: 'JWT',
alg: 'HS256'
}
const headerStr = Buffer.from(JSON.stringify(header)).toString('base64').replace(/=/g, '')
const payloadStr = Buffer.from(JSON.stringify(info)).toString('base64').replace(/=/g, '')
const signStr = sign(headerStr + '.' + payloadStr, key).replace(/=/g, '')
return headerStr + '.' + payloadStr + '.' + signStr
}
const key = '123456' // 秘钥是保存在服务器端的, 不会发送给客户端
const userInfo = {
userName: "userName",
age: 18
}
const result = JWT(userInfo, key)
console.log(result)