Возврат имени пользователя и идентификатора с помощью Django Rest Framework Simple JWT TokenRefresh - PullRequest
1 голос
/ 10 апреля 2020

Я использую Django Rest Framework и django -rest-framework-simplejwt для аутентификации. Отправляемые данные потребляются реагированием.

До сих пор мне удавалось создать подкласс TokenObtainPairSerializer для возврата имени пользователя и идентификатора при входе в систему / получении нового токена.

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  

Здесь имя пользователя всегда возвращается как пустая строка, а идентификатор всегда возвращается как ноль.

Я пробовал много разных способов в том числе пытаясь обновить эту информацию в самом представлении, но не могу заставить ее работать. Я заметил, что TokenRefreshSerializer подклассы serializers.Serializer, в то время как TokenObtainPairSerializer подклассы TokenObtainSerializer, который сам аутентифицирует пользователя, используя Django аутентификацию. По-видимому, для этого требуется пароль (например, когда пользователь входит в систему), но, очевидно, он не будет предоставлен при простом обновлении токена.

У меня вопрос, как я могу вернуть имя пользователя и идентификатор (или любой произвольный информация) о текущем пользователе при обновлении токена?

Последующим вопросом будет, будет ли практичнее просто сохранять эту информацию в localStorage на внешнем интерфейсе, когда пользователь впервые входит в систему и получает состояние повторно заполнять эти данные при каждом последующем посещении (до тех пор, пока пользователь не выйдет из системы или токен refre sh больше не действителен)?

Обратите внимание : это не репост из подобных вопросов, таких как , этот , потому что я нацеливаюсь на ОБНОВЛЕНИЕ токенов. Начальный TokenObtainPairView был простым для подкласса и реализации.

1 Ответ

1 голос
/ 11 апреля 2020

Поскольку конечная точка токена refre sh не устанавливает аутентифицированного разрешения, все, что вам остается для получения информации о пользователе, - токен refre sh. Так что я не думаю, что есть другой способ, кроме как декодировать этот токен и получить данные. Возможно, вы могли бы выполнить декодирование в бэкэнде, которое автоматически ответит на ваш последующий вопрос (да, вы должны), следует ли вам сохранить информацию о пользователе в localstorage и обновить ее sh с последующим обращением к защищенному API, который использует маркер доступа в качестве запроса Поле .user теперь будет установлено, и вы сможете получить пользовательские данные и обновить sh свое локальное хранилище на случай, если произойдет какое-либо обновление пользователя.

...