JWT验证

作者: broccoli_d39c | 来源:发表于2020-11-20 16:21 被阅读0次

    一、JWT是什么

    JWT即JSON Web Token,是一种认证鉴权方式,一般是用在我们的http接口请求上,将认证信息返回到客户端,储存在客户端,每次的接口调用都需要带上验证信息。

    二、JWT的结构

    JWT一共分为三个部分,header(头部)、 payload(负载) 和signature(签名)。
    JWT的格式如下所示:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    

    1. header(头部)

    header是一个json对象,描述了加密算法的方式及验证方式。通常为如下所示:

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    然后对这个json对象进行base64url的编码。
    

    2. payload(负载)

    payload存放的是实际需要传递的数据,可使用官方推荐的字段,也可自定义字段。通常为如下所示:

    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
    // 官方推荐的字段
    iss (issuer):签发人
    exp (expiration time):过期时间
    sub (subject):主题
    aud (audience):受众
    nbf (Not Before):生效时间
    iat (Issued At):签发时间
    jti (JWT ID):编号
    

    然后对这个json对象进行base64url的编码。

    3. signature(签名)

    signature主要是对header和payload进行签名,jwt 中常用的签名算法是 HS256,还需要一个用来加密的密钥secret。
    具体格式如下:

    HS256 (base64url(header) + '.' + base64url(payload), secret)
    

    4.最终格式

    将header、payload、signature用“.”连接起来。

    base64url(header) + "." + base64url(payload) + "." + signature
    

    base64Url方法:
    由于JWT可以放在URL中(例如api.example/?token=xxx)。 由于URL中“+”,“/”,“=”会被转义掉,所以Base64URL中需要对他们做替换,即把"="去掉,"+"用"-"替换,"/"用"_"替换。

    三、JWT的使用

    成功生成jwt后,可将jwt存在localStorage里,进行http请求时,将信息通过header的Authorization字段携带过去。

    四、JWT的验证

    服务端接收到jwt字符串后,对jwt进行验证。
    以下是node中的其中一种验证方式,直接调用了第三方库jsonwebtoken的方法。

    var jwt = require('jsonwebtoken');
    
    jwt.verify(jwtVal, 'your secret', function(err, decoded) {
        console.log('解码----', decoded)
    });
    
    /** 使用正确密钥获取到的decoded为 
    {
        "sub": "1234567890",
        "name": "John Doe",
        "iat": 1516239022
    }
    **/
    // 使用错误密钥获取到的decoded为 undefined
    

    除此之外,还可以将header、payload用base64url的方法进行解码,在使用已知密钥进行加密,再将加密后的值与从客户端传来的值进行对比。

    五、参考文档

    JWT官方文档:https://jwt.io/introduction/
    阮一峰JWT教程: https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

    相关文章

      网友评论

        本文标题:JWT验证

        本文链接:https://www.haomeiwen.com/subject/quphbktx.html