Как отменить обновление токена при сбросе пароля? - PullRequest
0 голосов
/ 06 января 2019

Я использую django-rest-framework-simplejwt , чтобы получить access token и refresh token.

Проблема в том, что refresh token не становится недействительным, если я изменю пароль пользователя. По сути, я могу продолжать отправлять refresh token и получать новые токены доступа даже после того, как пользователь сменил пароль.

Вместо этого я хотел бы попросить пользователя повторно ввести имя пользователя и новый пароль, чтобы получить новую пару access и refresh tokens.

Как бы мне этого добиться?



PS: только потому, что мне любопытно, разве это не должно быть поведением библиотеки по умолчанию? В каком случае мы хотим сохранить refresh token после изменения учетных данных?

1 Ответ

0 голосов
/ 07 января 2019

Я понял, как заставить это работать.
Что я сделал, это поставил сигнал, который отслеживает, изменился ли какой-либо обязательный параметр. Если это так, он помещает в черный список все токены обновления, связанные с этим пользователем.
Вот код:

Сначала добавьте 'rest_framework_simplejwt.token_blacklist' в установленные приложения. Тогда:

@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, update_fields, **kwargs):
    if not instance._state.adding: #instance._state.adding gives true if object is being created for the first time
        existing_user = User.objects.get(pk=instance.pk)
        if instance.password != existing_user.password or instance.email != existing_user.email or instance.username != existing_user.username:
        # If any of these params have changed, blacklist the tokens
              outstanding_tokens = OutstandingToken.objects.filter(user__pk=instance.pk)
              # Not checking for expiry date as cron is supposed to flush the expired tokens
              # using manage.py flushexpiredtokens. But if You are not using cron, 
              # then you can add another filter that expiry_date__gt=datetime.datetime.now()

              for out_token in outstanding_tokens:
                   if hasattr(out_token, 'blacklistedtoken'):
                       # Token already blacklisted. Skip
                       continue

                       BlacklistedToken.objects.create(token=out_token)

То, что в основном делает этот код, получает все выдающиеся токены для пользователя, а затем добавляет их в черный список. Вы можете получить больше информации о выдающихся / занесенных в черный список токенах здесь. https://github.com/davesque/django-rest-framework-simplejwt#blacklist-app

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...