jwt实现原理
1.前戏
JsonWebToken,一种不存储在服务端端token验证方式,采取数字签名来验证token的合法性
2.jwt的实现过程
- 用户提交用户名和密码给服务端,如果登陆成功,使用jwt创建一个token,给用户返回
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
一段jwt生成的token由三段字符串由.
拼接生成
- 第一段字符串,header,内部包括了算法名称和token类型
{
"alg": "HS256",
"typ": "JWT"
}
对第一段字符串进行base64url
- 第二段字符串,payload,放置数据
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
'exp':123432123 # 超时时间
}
对第二段字符串也进行base64url
编码
- 第三段字符串
将第一部分和第二部分经过base64url
编码后的值,以及your-256-bit-secret
(私钥),传入SHA-256
进行数字签名 (vertify SIGNATURE
)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
⚠️注意
- 这里的私钥,your-256-bit-secret,需要保证安全🔐
- 在django中,一般可以使用django为我们生成的一段随机字符串
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-x$q9c0wj^-956pbu$20usk1n%d)$(!%i2(rss#yhey-u*ne$(f'
可以使用这个私钥作为jwt的私钥
之后进行base64url
编码,拼接成为jwt的第三部分,
至此,生成了完整的jwt,返回给用户