You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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即时作废:
    1. 用Redis存储需要作废的旧token,过期时间设置为和JWT有效期一致(1小时)
    2. 自定义JWT认证类,每次校验token时先查Redis中是否存在该token,存在则直接返回认证失败
    3. 每次生成新token后,将请求携带的旧token存入Redis黑名单即可

如果需要全局所有接口都自动返回新token,可以自定义DRF的响应拦截器,统一处理token生成和返回逻辑,不需要逐个视图修改。


内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:09:02