使用dj_rest_auth(JWT)登录时refresh token为空的问题求助
dj-rest-auth JWT登录时响应体refresh_token为空的问题
注册新账号时,接口响应会同时返回access token和refresh token,但使用账号凭证登录时,响应体中的refresh_token为空字符串,不过响应头里已经正确设置了refresh token的Cookie。相关配置及响应示例如下:
配置代码(Settings.py)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'rest_framework', 'rest_framework.authtoken', 'allauth', 'allauth.account', 'allauth.socialaccount', 'dj_rest_auth', 'dj_rest_auth.registration', 'accounts.apps.AccountsConfig', ] REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'accounts.permissions.IsStaffOrReadOnly', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', ], } SITE_ID = 1 REST_AUTH = { 'USE_JWT': True, 'JWT_AUTH_COOKIE': 'access', 'JWT_AUTH_REFRESH_COOKIE': 'refresh', }
登录接口响应示例
{ "access_token": "eyJhbGciOiJ.....", "refresh_token": "", "user": { "pk": 2, "username": "test_user_0", "email": "test0@mysite.co", "first_name": "", "last_name": "" } }
解决方案
这是dj-rest-auth的默认行为:当启用JWT Cookie认证模式时,登录接口仅会通过Set-Cookie响应头设置refresh token,不会在响应体中返回;而注册接口因为是创建新用户的场景,默认会在响应体返回refresh token,这是两者的设计差异。
如果需要登录接口也在响应体返回refresh token,可以通过自定义登录序列化器实现:
- 创建自定义登录序列化器
在你的accounts应用下新建serializers.py,编写以下代码:
from dj_rest_auth.serializers import LoginSerializer from rest_framework_simplejwt.tokens import RefreshToken class CustomLoginSerializer(LoginSerializer): def get_token(self, user): refresh = RefreshToken.for_user(user) # 将refresh token字符串加入响应数据 self.token['refresh_token'] = str(refresh) self.token['access_token'] = str(refresh.access_token) return self.token
- 配置使用自定义序列化器
在settings.py的REST_AUTH配置中指定自定义序列化器的路径:
REST_AUTH = { 'USE_JWT': True, 'JWT_AUTH_COOKIE': 'access', 'JWT_AUTH_REFRESH_COOKIE': 'refresh', 'LOGIN_SERIALIZER': 'accounts.serializers.CustomLoginSerializer', # 替换为实际路径 }
重启服务后,登录接口的响应体就会包含完整的refresh_token值了。
内容的提问来源于stack exchange,提问作者Morteza
相关产品推荐
相关产品推荐

