0
点赞
收藏
分享

微信扫一扫

使用NodeJs的JWT实现token登录认证

毅会 2021-09-24 阅读 52

JWT 官网:https://jwt.io/


进入官网往下滑,能够看到加密工具。大致功能使用如下图:


根据上面的工具我们来看看 JWT 的 Token 组成:
JWT 标准的 Token 有三个部分:

    header(头部)
    payload(数据)
    signature(签名)
    中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

可以简化为:

Header.Payload.Signature
  1. header 头部
    每个 JWT token 里面都有一个 header,也就是头部数据。里面包含加密类型以及签名所用的算法等。例如下面:
{
  "alg": "HS256",
  "typ": "JWT"
}

alg 属性表示签名的算法(algorithm),默认是HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。

  1. 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 算法转成字符串。

  1. 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。

举报

相关推荐

0 条评论