4

我正在使用 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

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

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 总是作为 null 返回。

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

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

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

请注意:不是类似问题的转贴,因为我的目标是令牌的刷新。最初TokenObtainPairView的子类和实现很简单。

4

1 回答 1

3

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

于 2020-04-11T12:40:08.037 回答