使用的三方库为pyjwt,可以通过以下命令安装
$ pip isntall pyjwt
jwt可以分为encode编码和decode解码:
jwt.encode()
: 配合密钥将字典格式的数据,编码成字符串,即tokenjwt.decode()
: 配合密钥将字符串token还原成字典个数数据
一般来说,这个字典格式的数据中还要包含一个'exp': 'token过期时间戳'
,用于验证token是否过期,例如:
import time
import jwt # 需要安装pyjwt pip isntall pyjwt
secret_key = 'secret' # 密钥
# 生成token
data = {'a': 1, 'b': 2}
data['exp'] = int(time.time()) + 60 *5 # 过期时间设置为 当前时间加5分钟
token = jwt.encode(data, secret_key, algorithm='HS256')
# 验证token
data1 = jwt.encode(token, secret_key, algorithms=['HS256']) # 注意解码时,算法参数为algorithms,多一个s
# 如果token不合法,解码时会抛出jwt.PyJWTError异常
exp = data1.pop('exp') # 得到超时时间
assert exp >= time.time() # 验证未过期
assert data1 == data # 验证还原的数据与原数据相同
参考封装如下:
import time
import jwt
JWT_TOKEN_EXPIRE_TIME = 3600 * 2 # token有效时间 2小时
JWT_SECRET = 'abc' # 加解密密钥
JWT_ALGORITHM = 'HS256' # 加解密算法
def generate_jwt_token(user_id: int)->str:
"""根据用户id生成token"""
payload = {'user_id': user_id, 'exp': int(time.time()) + JWT_TOKEN_EXPIRE_TIME}
token = jwt.encode(payload, JWT_SECRET, algorithm=JWT_ALGORITHM)
return token
def verify_jwt_token(user_id: int, token: str)->bool:
"""验证用户token"""
payload = {'user_id': user_id}
try:
_payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
except jwt.PyJWTError:
print('token解析失败')
return False
else:
print(_payload)
exp = int(_payload.pop('exp'))
if time.time() > exp:
print('已失效')
return False
return payload == _payload
if __name__ == '__main__':
user_id = 123
token = generate_jwt_token(user_id)
print(verify_jwt_token(user_id, token))
实际在使用中JWT Token一般放于请求头Authorization中,例如:
GET https://... HTTP/1.1
...
Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTY1Mjk0MDUxOX0.3N5AhXCBumF4CbGwWRUioOzYLWvnpIuhLI2LpDFF5M0
...