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

Django+dj-rest-auth登录时JWT Refresh Token无法生成问题求助

问题分析与解决方案

这不是dj-rest-auth的bug,是框架的安全设计逻辑

当你设置JWT_AUTH_HTTPONLY=True时,dj-rest-auth为防范XSS攻击窃取refresh token,会将refresh token以HttpOnly Cookie的形式返回给客户端,而不在接口的JSON响应体中输出,所以你看到响应里的refresh字段是空字符串"",这是预期行为。

三种解决思路

1. 让refresh token在响应体中返回(放弃HttpOnly Cookie)

直接修改settings.py中的配置:

JWT_AUTH_HTTPONLY = False

修改后,登录接口的响应体就会正常包含refresh token,但这种方式会降低安全性,refresh token可能被XSS脚本窃取。

2. 保留HttpOnly Cookie的安全特性(推荐)

  • 登录成功后,浏览器会自动保存HttpOnly类型的refresh token Cookie,前端无需手动存储。
  • 后续调用刷新token的接口(如/dj-rest-auth/token/refresh/)时,浏览器会自动在请求中携带该Cookie,无需在请求参数里手动传入refresh token。
  • 可通过浏览器开发者工具的Application -> Cookies面板,确认refresh token是否已被正确设置。

3. 自定义LoginView,同时返回Cookie和响应体中的refresh token

如果既想保留HttpOnly Cookie的安全性,又需要在响应体中拿到refresh token,可以自定义LoginView覆盖原有逻辑:

首先创建自定义视图:

from dj_rest_auth.views import LoginView

class CustomLoginView(LoginView):
    def get_response_data(self, user):
        response_data = super().get_response_data(user)
        # 强制将refresh token加入响应体
        if self.refresh_token:
            response_data['refresh'] = str(self.refresh_token)
        return response_data

然后在urls.py中替换原登录路由:

from django.urls import path
from .views import CustomLoginView

urlpatterns = [
    path('login/', CustomLoginView.as_view(), name='rest_login'),
    # 其他dj-rest-auth路由保持不变
    # path('dj-rest-auth/', include('dj_rest_auth.urls')),
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:32:22