JWT
Django
因为HTTP协议是不存储状态的。
JWT
JWT通常由三部分组成
- header
- payload
- signture
这三个部分通常用·分隔
ed649690-d62f-417b-8716-0241665dc54c
Header头部
包含了两部分,Token类型和采用的加密算法。
例如HMAC SHA256或RSA 。
它会使用 Base64 编码组成 JWT 结构的第一部分
{
"alg": "HS256",
"typ": "JWT"
}
Payload
就是存放信息的地方,可以把用户的信息放到这里。
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):接收者的URL地址
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
> 比如
{
"iss": "lee JWT",
"iat": 1441593502,
"exp": 1441594722,
"aud": "www.example.com",
"sub": "6465644@163.com"
}
Python使用
客户端收到服务器返回的 JWT,可以储存在 Cookie
里面,也可以储存在 localStorage
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization
字段里面。
User-Agent: Mozilla/5.0...
X-Litemall-Admin-Token: ed649690-d62f-417b-8716-0241665dc54c
流程
前端通过表单将用户名与密码发送后端,后端验证通过将用户的ID信息作为JWT的 PayLoad。形成JWT作为Response。前端每次请求时,将JWT放入HTTP Header的 Authorization 属性中。
pip install pyjwt
生成一个JWT Token
import jwt # 导入JWT
import time
import base64
import json
# Headers
headers = {
"typ": "JWT",
'alg': 'HS256'
}
print(base64.b64encode(bytes(json.dumps(headers), encoding='utf-8')))
payload = {
'exp': int(time.time()) + 60*60*24*7, # 过期时间
'data': { # 内容 一般存取用户ID和开始时间
'userid':'1'
}
}
# 生成
res = jwt.encode(
payload,
key='taoya', # 进行加密签名的密钥
algorithm="HS256",
headers=headers
).decode('utf-8') # 编码后得到 bytes, 再进行解码得到一个str
print("加密")
print(res)
###############################################################
print("解密")
source = jwt.decode(res, key='taoya')
print(source)
b'eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9'
加密
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODgwNjg3MTMsImRhdGEiOnsidXNlcmlkIjoiMSJ9fQ.5ajZEa2-cBs_GxlPYcSM56RZ1Xz7v8NiRnkWzMDlpfg
解密
{'exp': 1588068713, 'data': {'userid': '1'}}