使用 Django Rest Framework Simple JWT TokenRefresh 返回用户名和 ID



我正在使用Django Rest Framework和django-rest-framework-simplejwt进行身份验证。 正在发送的数据正在被 react 使用。

到目前为止,我已经能够在登录/获取新令牌时对TokenObtainPairSerializer进行子类化以返回用户名和 ID。

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super(MyTokenObtainPairSerializer, self).validate(attrs)
data.update({'user': self.user.username})
data.update({'id': self.user.id})
return data

我正在尝试在刷新令牌时返回用户用户名和密码。 但是,这不起作用:

class MyTokenRefreshSerializer(TokenRefreshSerializer):
def validate(self, attrs):
data = super(MyTokenRefreshSerializer, self).validate(attrs)
user = self.context['request'].user
data.update({'user': user.username})
data.update({'id': user.id})
return data  

在这里,用户名始终作为空字符串返回,ID 始终作为空返回。

我已经尝试了许多不同的方法,包括尝试在视图本身中更新此信息,但似乎无法使其正常工作。 我注意到TokenRefreshSerializer子类serializers.Serializer而 TokenObtainPairSerializer 子类TokenObtainSerializer,它本身使用 Django 身份验证对用户进行身份验证。 这似乎需要一个密码(例如当用户登录时),但显然在简单地刷新令牌时不会提供密码。

我的问题是,刷新令牌时,如何返回有关当前用户的用户名和密码(或任何任意信息)?

接下来的问题是,当用户首次登录时,简单地将该信息保存到前端的 localStorage 中,并在每次后续访问时让状态重新填充该数据(直到用户注销或刷新令牌不再有效)是否更实用?

请注意:这不是类似问题的转发,因为我的目标是刷新令牌。 最初的TokenObtainPairView是直接的子类和实现。

由于刷新令牌终结点未设置经过身份验证的权限,因此获取用户信息的唯一时间就是刷新令牌。所以我认为除了解码该令牌并获取数据之外,没有其他方法。您可能可以在后端进行解码,它会自动回答您的后续问题(是的,您应该)是否应该将用户信息保存在 localstorage 上,并通过随后对使用访问令牌的受保护 API 进行刷新,因为现在将设置请求.user 字段,您可以获取用户数据并刷新您的本地存储,以防发生某些用户更新。

最新更新