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

