JWT 官网:https://jwt.io/
进入官网往下滑,能够看到加密工具。大致功能使用如下图:
根据上面的工具我们来看看 JWT 的 Token 组成:
JWT 标准的 Token 有三个部分:
header(头部)
payload(数据)
signature(签名)
中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
可以简化为:
Header.Payload.Signature
- header 头部
每个 JWT token 里面都有一个 header,也就是头部数据。里面包含加密类型以及签名所用的算法等。例如下面:
{
"alg": "HS256",
"typ": "JWT"
}
alg
属性表示签名的算法(algorithm),默认是HMAC SHA256
(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。
- Payload
Payload 部分是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
exp (expiration time):过期时间 会常用到。里面还能定义私有字段。而且默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。也使用 Base64URL 算法转成字符串。
- Signature
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
加密使用的是 base64UrlEncode 可点击链接查看。
制作 TOKEN
首先去 npm 社区下载:jsonwebtoken
封装 token 的创建和验证:
const jwt = require("jsonwebtoken");
const secret = "aaabbbfadwesooweiiaf";
function createToken(payload){
payload.rtiem = new Date();
payload.exp = 60 * 60 * 2 *1000;
return jwt.sign(payload,secret);
}
function checkToken(token){
return new Promise((resolve,reject)=>{
jwt.verify(token,secret,(err,res)=>{
if(!err) {
resolve(res)
}else{
reject("token验证失败");
}
})
})
}
module.exports = {
createToken,checkToken
}
使用的时候:
//登录有效期和token的正确性验证
app.get('/list', function(req, res) {
checkToken(req.headers.Authorization).then(res=>{
//token验证成功
//判断过期时间
}).catch(err=>{
res.json({{err:-1,msg:'token非法'}})
})
});
if(){
let token = createToken({username:req.query.name});
res.json({err:0,msg:'OK',token});
}else{
res.json({err:-1,msg:'fail'});
}
记住客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。