方案
1.登录过后给前端进行返回token并设置了过期时间30分钟,每次请求的时候前端把token存在请求头里面进行发请求,后端接收请求的时候获取请求头出来进行jwt解析判断过期时间是否小于30分钟,如果小于30分钟就生成新的token在responseHearde进行返回即可
2.当某个用户触发事件时,使用中间件,后端检测发现token 快要到过期时间 ,
生成新的token以及refresh_token ,更新 redis缓存中的token信息,
后面前端请求Header中设置的token保持不变,校验有效性以缓存中的token为准
我这边用的第一种方案
中间件
from django.utils import deprecation
from xxxxxximport tools as ts
from django.core.cache import cache
from xxxxxximport settings as config
class MyMiddleware(deprecation.MiddlewareMixin):
def __init__(self, get_response=None):
self.get_response = get_response
def process_response(self, request, response):
auth_token = request.META.get('HTTP_AUTHORIZATION')
# 是否携带 access_token
if auth_token:
# 对 收到的 头部 access_token 进行处理
auth_token = str(auth_token).replace('Bearer ', '')
# 收到认证的 access_token 不在白名单以及黑名单
if not cache.has_key(auth_token + config.JWT_WHITE_LIST_TAG) and not cache.has_key(
auth_token + config.JWT_BLACK_LIST_TAG):
time_remaining = ts.output_time_remaining(auth_token)
# access_token 快要过期的时间
if time_remaining > 0:
# access_token 有效剩余时间 小于或等于 配置自动设置 token过期时间
if time_remaining <= config.JWT_TAG_TIME:
# 获取当前用户对象
user = request.user
new_token = ts.Create_token().validate(user)["token"]
response["NEW_HTTP_AUTHORIZATION"] = new_token
# 缓存 快要失效的 用户对象设置白名单 值 ---> 用户对象 过期时间 ------> 原access_token 过期时间
cache.set(auth_token + config.JWT_WHITE_LIST_TAG, {"user_obj": user}, time_remaining)
return response
具体整体代码就不细写
整体流程图 :