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

Posted

技术标签:

【中文标题】使用 Django Rest Framework Simple JWT TokenRefresh 返回用户名和 ID【英文标题】:Return Username and ID with Django Rest Framework Simple JWT TokenRefresh 【发布时间】:2020-07-23 09:43:30 【问题描述】:

我正在使用 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 并让状态在每次后续访问时重新填充该数据(直到用户登录out,或者刷新令牌不再有效)?

请注意:这不是this one等类似问题的转发,因为我的目标是刷新令牌。最初的 TokenObtainPairView 易于继承和实现。

【问题讨论】:

如您提到的帖子中一样,覆盖 MyTokenRefreshSerializer 类的 to_representation() 方法 @ArakkalAbu 在链接的帖子中说答案已过时,我们需要覆盖 validate 方法。这是不正确的吗?只是好奇,因为如果它过时了,我会远离它。 @ArakkalAbu 我认为在查看源代码和我看到的错误时这不会起作用。特别是因为MyTokenRefreshSerializer 上不会有self.user。试图访问它会导致错误。分配它只返回一个空字符串(如果使用request.user 分配值)。 为了解决这个问题,我只是使用我需要的信息创建一个自定义令牌声明并在浏览器中对其进行解码。但是应该有一种方法可以直接在响应中简单地发送数据? 由于刷新令牌端点未设置经过身份验证的权限,因此您获取用户信息的唯一途径就是刷新令牌。所以我认为除了解码该令牌并获取数据之外没有其他方法。您可能可以在后端进行解码,它会自动回答您的后续问题(是的,您应该)是否应该将用户信息保存在本地存储中并在随后命中使用访问令牌作为 request.user 字段的受保护 api 时刷新它现在将被设置,您可以获取用户数据并刷新您的本地存储,以防发生某些用户更新。 【参考方案1】:

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

【讨论】:

以上是关于使用 Django Rest Framework Simple JWT TokenRefresh 返回用户名和 ID的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

18-Django REST framework-使用Django开发REST 接口

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

django rest framework中文介绍

使用 django-rest-framework-simplejwt 注册后返回令牌