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

使用DRF-simple-jwt时,TokenRefreshView为何未返回refresh token?

问题分析与解决方案

为什么响应数据中没有"refresh"字段?

DRF-simple-jwt的TokenRefreshView默认行为规则如下:

  • 当未在配置中开启ROTATE_REFRESH_TOKENS = True时,刷新接口仅返回新的access令牌,不会生成并返回新的refresh令牌,因此response.data中自然没有refresh字段。
  • 只有开启了刷新令牌旋转功能,刷新接口才会在返回access令牌的同时,生成新的refresh令牌并包含在响应数据中。
  • 另外也需检查你的CookieTokenRefreshSerializer是否重写了逻辑,意外移除了refresh字段的返回。

修复步骤

方案1:开启刷新令牌旋转(需更新refresh令牌场景)

在项目的settings.py中添加或修改SIMPLE_JWT配置:

SIMPLE_JWT = {
    # 保留你原有的其他配置
    'ROTATE_REFRESH_TOKENS': True,
    # 可选:开启后旧的refresh令牌会被加入黑名单,防止重复使用
    'BLACKLIST_AFTER_ROTATION': True,
}

开启后,每次调用刷新接口都会返回新的refresh令牌,你的if分支逻辑将正常执行。

方案2:完善finalize_response方法(避免返回None)

无论是否存在refresh字段,都必须确保视图方法返回HttpResponse对象,否则会触发500错误。修改你的视图代码:

class CookieTokenRefreshView(TokenRefreshView):
    def finalize_response(self, request, response, *args, **kwargs):
        if response.data.get("refresh"):
            cookie_max_age = 3600 * 24 * 14
            response.set_cookie(
                "refresh_token", 
                response.data["refresh"],
                max_age=cookie_max_age,
                httponly=True, 
                secure=True,
                samesite='Strict'
            )
            del response.data["refresh"]
        # 确保无论分支是否执行,都返回响应对象
        return super().finalize_response(request, response, *args, **kwargs)
    
    serializer_class = CookieTokenRefreshSerializer

如果不需要刷新令牌旋转,这个方案可以直接解决500错误,同时保留原有逻辑(仅在有refresh字段时更新Cookie)。

内容的提问来源于stack exchange,提问作者U. Watt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:18