jwt
- json web token ,一般用于用户认证(前后端分离小程序/微信小程序/app开发)
- 基于传统的token认证
- 用户登录,服务端返回token,并将token保存在服务端(服务端的数据库中)
- 以后用户再来访问时,需要携带token,服务端获取token后,再去数据库中获取token进行校验(与服务器的数据库中的token进行对比校验)
- jwt
- 用户登录,服务端给用户返回一个token(服务端不保存)
- 以后用户再来访问,需要携带token,服务端获取token后,再做token校验(算法校验)
- 优势:相较于传统的token相比,它无需在服务端保存token
jwt的实现过程
-
第一步,用户提交用户名和密码给服务端,如果登陆成功,使用jwt创建一个token,并给用户返回
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
注意:jwt生成的token是由三段字符串组成的,用
.
连接起来-
第一段字符串,HEADER:ALGORITHM & TOKEN TYPE
json 转化成字符串,然后做base64url加密(先用base64加密,然后做特殊符号替换)
{ "alg": "HS256", "typ": "JWT" }
-
第二段字符串,PAYLOAD:DATA
json 转化成字符串,然后做base64url加密(先用base64加密,然后做特殊符号替换)
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 #超时时间(exp) }
-
第三段字符串,VERIFY SIGNATURE
- 第1/2部分的密文拼接起来
- 对前两部分密文进行HASH256加密+加盐(增加随机字符串)
- 再做base64url加密
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret )
-
-
以后用户再来访问的时候,需要携带token,后端需要对token进行校验
-
获取token
-
第一步:切割token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
第二步:把第二段进行base64url解密,并获取payload信息,检测是否超时
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 #超时时间(exp) }
-
第三步:
- 把第1/2段拼接
- 再次执行hash256加密 + 加盐
- 密文 = base64解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c),如果相等,表示token未被修改过,则认证通过
-
应用
pip install pyjwt