jwt实现原理

1.前戏

JsonWebToken,一种不存储在服务端端token验证方式,采取数字签名来验证token的合法性

2.jwt的实现过程

  1. 用户提交用户名和密码给服务端,如果登陆成功,使用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的第三部分,

image

至此,生成了完整的jwt,返回给用户

posted @ 2022-10-15 11:36  uichuan_47  阅读(96)  评论(0)    收藏  举报