DRF-simplejwt用法
### settings
......
SECRET_KEY = 'django-insecure-io=8w46&gi9#b_&3d=22t9)+l_fa(kg^aoouov!!g=^hb972g9'
# jwt token配置
JWT = {
# token失效时间,单位分钟
'EXPIRE_MINUTES': 60 * 4
}
- 自定义的SECRET_KEY = settings.SECRET_KEY (推荐使用django项目生成的key)
- 自定义的playload负载
# 定义JWT的payload(负载)
payload = {
'id': user.id,
'username': user.username,
'exp': datetime.datetime.now() + datetime.timedelta(minutes=EXPIRE_MINUTES) # 设置过期时间
}
import jwt
import datetime
from django.conf import settings
def generate_token(user: UserInfo) -> str:
payload = {
'id': user.id,
'username': user.username,
'exp': datetime.datetime.now() + datetime.timedelta(minutes=EXPIRE_MINUTES) # 设置过期时间
}
# 指明算法HS256
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return token
def is_token_valid(token: str) -> bool:
try:
# 这句若执行不成功,即抛出异常
jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return True
except jwt.InvalidTokenError:
return False
def is_token_expired(token: str) -> bool:
try:
# 没有过期
decoded_token = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return False
except jwt.ExpiredSignatureError:
return True
def parse_token(token: str) -> UserInfo:
try:
# 解析正确,则返回token对象
decoded_token = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return UserInfo(decoded_token["id"], decoded_token["username"])
except jwt.ExpiredSignatureError:
print("Token is expired.")
except jwt.InvalidTokenError:
print("Token is invalid.")
# 解析错误,返回一个空User对象
return UserInfo(id=None, username=None)
def update_token_expiration(token: str) -> str:
# 获取token
decoded_token = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
# 更新过期时间
decoded_token["exp"] = datetime.datetime.now() + datetime.timedelta(minutes=EXPIRE_MINUTES) # 设置过期时间
# 重新生成token
updated_token = jwt.encode(decoded_token, SECRET_KEY, algorithm="HS256")
return updated_token