Python使用JWT


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}
----------------------------------------------