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);
}
);
参考
base64Url编码:与base64编码相似。JWT作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_;
HMAC SHA256 HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的 Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值 作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。