Return 使用 Django Rest Framework Simple JWT TokenRefresh 的用户名和 ID

Return Username and ID with Django Rest Framework Simple JWT TokenRefresh

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

到目前为止,我已经能够在登录/获取新令牌时将 TokenObtainPairSerializer 子类化为 return 用户名和 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

我也在尝试在刷新令牌时让用户的用户名和 ID returned。但是,这不起作用:

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  

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

我尝试了很多不同的方法,包括尝试在视图本身中更新此信息,但似乎无法让它发挥作用。我注意到 TokenRefreshSerializer 子类 serializers.Serializer 而 TokenObtainPairSerializer 子类 TokenObtainSerializer 本身使用 Django 身份验证对用户进行身份验证。这似乎需要密码(比如用户登录时),但显然在刷新令牌时不会提供密码。

我的问题是,如何在刷新令牌时return当前用户的用户名和ID(或任意信息)?

接下来的问题是,当用户首次登录并让状态在每次后续访问时重新填充该数据(直到用户注销,或者刷新令牌不再有效)?

请注意:这不是this one等类似问题的转贴,因为我是针对代币的REFRESHING。最初的 TokenObtainPairView 可以直接进行子类化和实现。

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