JWT
jwt(JSON Web Tokens),在用户认证当中常用的方式,在如今的前后端分离项目当中应用广泛。
传统token和jwt区别
- 传统token:服务端会对登录成功的用户生成一个随机token返回,同时也会在本地保留对应的token(如在数据库中存入:token、用户名、过期时间等),当用户再次访问时,会携带之前的token给服务端进行校验,服务端则通过与本地保留的token进行对比,若寻找到符合条件的token数据,则校验成功。
- jwt:服务端会对登录成功的用户生成一个随机token返回,但并不会在服务端本地保留(这是jwt和传统token最大的区别),而当用户再次访问时,服务端会基于jwt对token进行校验和解码(由于jwt是基于base64url编码,因此是可以反向解码的,所以一定要小心token泄漏的问题,以及不要在token中存放敏感数据。
Python使用jwt
pip install pyjwt
import time
import jwt
# 设置加密算法的配置
headers = {
'alg': 'HS256',
'typ': 'JWT'
}
# 随机的salt密码,只有token生成者(校验者)自己能有,校验生成的token是否合法
salt = 'dsaho;fyrlgbv'
# 设置超时间,当前时间的100s以后
exp = int(time.time() + 100)
# 主体信息,不能存放敏感信息,容易被破解
info = {
'username': 'zj1007',
'exp': exp
}
# 生成token
'''
def encode(
self,
payload: Dict[str, Any],
key: str,
algorithm: Optional[str] = "HS256",
headers: Optional[Dict] = None,
json_encoder: Optional[Type[json.JSONEncoder]] = None,
) -> str:
'''
token = jwt.encode(payload=info, key=salt, algorithm='HS256', headers=headers)
print(token)
---------------------------------------------
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InpqMTAwNyIsImV4cCI6MTY0Njc4NzkwOH0.ZXizKv-JpLaJMqMwLYEOZvx27osq4cy-ArLGS3c5SRU
----------------------------------------------
# 解析token
'''
def decode(
self,
jwt: str,
key: str = "",
algorithms: List[str] = None,
options: Dict = None,
**kwargs,
) -> Dict[str, Any]:
'''
data = jwt.decode(jwt=token, key=salt, algorithms=['HS256'])
print(data)
----------------------------------------------
{'username': 'zj1007', 'exp': 1646787908}
----------------------------------------------