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

在Django Djoser的TokenRefreshSerializer中如何正确获取请求用户?

在Djoser的TokenRefreshSerializer中正确获取请求用户的方法

问题原因

你通过self.context['request'].user拿到AnonymousUser,是因为默认的TokenRefresh流程里,refresh token的验证逻辑在认证中间件处理之后执行,此时请求还未关联到具体用户,所以返回匿名用户。

可行解决方案

方案一:利用RefreshToken实例直接获取用户(推荐)

不用手动解析token查询用户,Django REST Framework SimpleJWT的RefreshToken已封装用户关联逻辑,直接调用即可:

from rest_framework_simplejwt.tokens import RefreshToken
from djoser.serializers import TokenRefreshSerializer

class CustomTokenRefreshSerializer(TokenRefreshSerializer):
    def validate(self, attrs):
        # 先执行父类验证,确保refresh token有效
        data = super().validate(attrs)
        # 通过refresh token实例直接获取关联用户
        refresh_token = RefreshToken(attrs['refresh'])
        user = refresh_token.user
        # 这里可基于user做后续业务逻辑
        return data

方案二:自定义认证类关联用户到request

如果必须通过self.context['request'].user获取用户,可以给TokenRefresh视图添加自定义认证类,提前解析refresh token并关联用户:

from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken
from djoser.views import TokenRefreshView

class RefreshTokenAuthentication(JWTAuthentication):
    def authenticate(self, request):
        # 仅处理refresh token请求
        if 'refresh' in request.data:
            try:
                refresh_token = RefreshToken(request.data['refresh'])
                # 返回用户实例,让request关联该用户
                return (refresh_token.user, None)
            except Exception:
                # 解析失败则返回None,走后续验证逻辑
                return None
        return super().authenticate(request)

# 自定义TokenRefresh视图,使用上面的认证类
class CustomTokenRefreshView(TokenRefreshView):
    authentication_classes = [RefreshTokenAuthentication]

之后在序列化器里就能通过self.context['request'].user拿到实际用户,但注意这个认证类仅适用于TokenRefresh场景,避免影响其他视图的认证逻辑。

注意事项

  • 务必先调用super().validate(attrs)完成refresh token的有效性验证,再处理用户逻辑,避免使用无效token导致错误。
  • 优先使用方案一,更符合Djoser和SimpleJWT的设计规范,代码更简洁安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:22:10