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

