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

使用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,可以通过自定义登录序列化器实现:

  1. 创建自定义登录序列化器
    在你的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
  1. 配置使用自定义序列化器
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:57:37