Javascript is required
JWT

因为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'}}