使用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
相关产品推荐
相关产品推荐

