1、JWT使用:
①:生成token:jwt.encode(payload, key, algorithm)
headers:默认为三位字符串,可省略
payload:组成的参数字典,类型:dict
key:自定义的加密密钥,类型:str
algorithm:加密方法(HS256,RSA256等),类型:str
SECRET_KEY = 'scorhl*98f*8fr*vf8vf5'
def GetToken(id, username, auth):
ADMIN_TOKEN_EXPIRE = 14 * 24 * 60 * 60
now = int(time.time())
token = jwt.encode(
headers={
'typ': 'POI',
'alg': 'HS256'
},
payload={
'exp': now + ADMIN_TOKEN_EXPIRE,
'iat': now,
'data': {
'id': id,
'username': username,
'auth': auth,
}
},
key=SECRET_KEY,
algorithm='HS256'
)
return token
print('GetToken: \n', GetToken(12, 'scorhl', 1))
结果:
GetToken:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzQwMTQzMzAsImlhdCI6MTYzMjgwNDczMCwiZGF0YSI6eyJpZCI6MTIsInVzZXJuYW1lIjoic2NvcmhsIiwiYXV0aCI6MX19.fGmv0Xyccapm6Mxz2EMu2vn0CWP8JxiCs4qVdCfEMAc
②:解析token:jet.decode(jwt, key, algorithms)
jwt:生成的token字符串,类型:str
key:与encode的key字符串相同,类型:str
algorithms:(注意:这个需要加s)与encode的加密方法相同,类型:str
def GetName(token):
data = jwt.decode(
jwt=token,
key=SECRET_KEY,
algorithm='HS256')
return data
print('GetName: \n', GetName(GetToken(12, 'scorhl', 1)))
结果:
GetName:
{'exp': 1634014330, 'iat': 1632804730, 'data': {'id': 12, 'username': 'scorhl', 'auth': 1}}
2、JWT由三部分构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
header
jwt的头部承载两部分信息:
- 声明类型,这里是jwt
- 声明加密的算法 通常直接使用 HMAC SHA256
完整的头部就像下面这样的JSON:
{ 'typ': 'POI', 'alg': 'HS256' }
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
playload
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
- 标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明 (建议但不强制使用) :
- iss: jwt签发者
- sub: jwt所面向的用户
- aud: 接收jwt的一方
- exp: jwt的过期时间,这个过期时间必须要大于签发时间
- nbf: 定义在什么时间之前,该jwt都是不可用的.
- iat: jwt的签发时间
- jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
私有的声明 :
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
定义一个payload:
{ 'id': id, 'username': username, 'auth': auth, }
然后将其进行base64加密,得到Jwt的第二部分
eyJleHAiOjE2MzQwMTQzMzAsImlhdCI6MTYzMjgwNDczMCwiZGF0YSI6eyJpZCI6MTIsInVzZXJuYW1lIjoic2NvcmhsIiwiYXV0aCI6MX19
signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
- header (base64后的)
- payload (base64后的)
- secret
这个部分需要base64加密后的header和base64加密后的payload使用.
连接组成的字符串,然后通过header中声明的加密方式进行加盐secret
组合加密,然后就构成了jwt的第三部分。
fGmv0Xyccapm6Mxz2EMu2vn0CWP8JxiCs4qVdCfEMAc
密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好。