如何使用Django REST Framework延长JWT会话token有效期
Django JWT 会话有效期延长解决方案
新token生成方法
你登录时已经用到了djangorestframework-jwt内置的载荷生成、编码方法,直接复用这套逻辑就能生成新的有效期延长1小时的token,不需要额外调用新接口。
首先建议把生成token的逻辑抽为公共工具方法,避免代码重复:
from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER def generate_new_token(user): # 自动读取settings里配置的JWT_EXPIRATION_DELTA生成新的过期时间 payload = jwt_payload_handler(user) return jwt_encode_handler(payload)
登录逻辑里也可以直接调用这个方法,替换原来的生成逻辑即可。
视图层修改示例
你用到了JSONWebTokenAuthentication和IsAuthenticated权限类,认证通过后request.user已经是当前登录的合法用户对象,不需要自己手动解码token校验,直接生成新token塞进响应体即可:
class UserProfileView(RetrieveAPIView): permission_classes = (IsAuthenticated,) authentication_class = JSONWebTokenAuthentication def get(self, request): try: # 原有业务逻辑不变,不需要自己解析token status_code = status.HTTP_200_OK # 生成新的延长有效期的token new_token = generate_new_token(request.user) response = { 'success': 'true', 'status code': status_code, 'message': 'User profile fetched successfully', 'token': new_token, # 新增字段返回新token 'data': { #... 原有业务数据 } } except Exception as e: status_code = status.HTTP_400_BAD_REQUEST response = { 'success': 'false', 'status code': status.HTTP_400_BAD_REQUEST, 'message': '请求失败', 'error': str(e) } return Response(response, status=status_code)
客户端拿到响应后替换本地存储的旧token即可。
旧token处理方案
JWT本身是无状态的,默认未过期的旧token都能通过校验,你可以根据业务需求二选一:
- 方案1(轻量实现):不做旧token作废处理,允许旧token在原有剩余有效期内使用,实现成本最低,适合安全性要求不高的场景
- 方案2(严格安全):增加token黑名单机制,实现旧token即时作废:
- 用Redis存储需要作废的旧token,过期时间设置为和JWT有效期一致(1小时)
- 自定义JWT认证类,每次校验token时先查Redis中是否存在该token,存在则直接返回认证失败
- 每次生成新token后,将请求携带的旧token存入Redis黑名单即可
如果需要全局所有接口都自动返回新token,可以自定义DRF的响应拦截器,统一处理token生成和返回逻辑,不需要逐个视图修改。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

