jwt使用

116 阅读2分钟

jwt组成

jwt由三部分组成,分别是头部、载荷、签名,三部分之间用点号分隔。 例如: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCIsImV4cCI6MTY0NjEyNzg1MSwiaWF0IjoxNjQ2MTI0MjUxfQ.V4rh8Ord_rUMBbmlaxhA0KbDkR_Nt7GJZJGuMcewU3Y

1. 头部

头部使用Base64URL进行编码,其解码后的结果如下,其中alg表示签名使用的加密算法,默认的HMAC SHA256(HS256),type表示token的类型是jwt

{
    "alg": "HS256",
    "typ": "JWT"
}

2. 载荷

载荷也采用Base64URL编码,其解码后的结果如下,其中data是放入的自定义信息,一般存放userId等信息。exp表示过期时间,iat表示签发时间。

{
    "data": "test",
    "exp": 1646127851,
    "iat": 1646124251
}

3. 签名

签名部分是对前两部分的加密,防止数据被篡改。加密过程如下,其中secret是存放在服务端的密钥

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

js的实现

const jwt = require("jsonwebtoken") 
jwt.sign({
    data: userinfo,
    exp: Math.floor(Date.now() / 1000) + 60 * 60
},secret)

使用方法

服务端生成token给到前端,前端保存在cookie或者localstorage中,每次请求的时候添加到http的请求头中。 ps: Beare作为一种认证类型(基于OAuth 2.0),使用"Bearer"关键词进行定义。

axios.interceptors.request.use(
    config => {
        const token = window.localStorage.getItem("token");
        if (token) {
            config.headers.common["Authorization"] = "Bearer " + token;
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    }
);

参考

阮一峰博客---base64编码原理

base64Url编码:与base64编码相似。JWT作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_;

HMAC SHA256 HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的 Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值 作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。