网站登录JWT的实现

2,784 阅读2分钟

1、关于jwt

  • JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。

  • JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。

2、jwt的构成

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature)。

  1. header

    jwt的头部承载两部分信息:

    • 声明类型,这里是jwt

    • 声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON:

{

    typ: "JWT",

    alg: "HS256"

}

  1. playload

    载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

    • 标准中注册的声明

    • 公共的声明

    • 私有的声明

  2. signature

    jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

    • header (base64后的)

    • payload (base64后的)

    • secret

      这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分:

      49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY

      密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好。

相对来说一个完整的jwt token信息的整体结构为:

header (base64)+payload (base64)+Signature 

3. jwt 的实现

代码实现:

// jwt 登录,config.seret 为设置的服务器密钥
// exp: 为token的有效期
// name: 这里是包含的用户信息,可以任意配置
var token = jwt.sign({
    exp: Math.floor(Date.now() / 1000) + 60*60*24,
    name: data.person,
    ....
}, config.secret, function(err, token) {
    res.json({
        msg: {
            status: 1,
            msg: "登录成功"
        },
        data: {
            token: token,
        }
    })
});

// 验证jwt
new Promise(function(resolve, reject) {
    jwt.verify(token, config.secret, function(err, decoded) {
        if (err) {
            res.json({
                ok: 0,
                msg: err
            })
        } else {
            // 如果验证成功的话这里做相应的后台数据处理
        }
    });
});

参考链接: jwt官网