Прежде всего, я новичок в django-rest-framework
, поэтому, пожалуйста, извините, если я ошибаюсь.
Я работаю с django-rest-auth
и django-restframework-jwt
для аутентификации пользователей.Я сохраняю токен jwt
в localStorage каждый раз, когда пользователь входит в систему.
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я вхожу с одинаковыми учетными данными в двух браузерах, а затем меняю пароль в одномиз них другая учетная запись все еще действительна, и пользователь все еще может перемещаться и видеть все страницы, даже если пароль изменился.
Я хотел сделать его токен JWT
недействительным при смене пароля, чтобы он автоматически выходил из системы.Но я не смог найти способ истечения срока действия его токена в официальной документации Django REST framework JWT
Я попытался отследить момент смены пароля, вручную сгенерировав новый токен JWT для пользователя,но это не работает (возможно, потому что существующий токен все еще действителен)
@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, **kwargs):
existing_user = User.objects.get(pk=instance.pk)
if getattr(settings, 'REST_USE_JWT', False):
if instance.password != existing_user.password:
# If user has changed his password, generate manually a new token for him
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(instance)
payload['orig_iat'] = timegm(datetime.utcnow().utctimetuple())
instance.token = jwt_encode_handler(payload)
После прочтения некоторых документов и сообщений, кажется, что это не совсем просто, только с jwt
, так как он не имеет состояния, но можеткто-нибудь указывает мне направление, куда идти?
Должен ли я удалить JWT
аутентификацию?
Есть ли способ, который может мне помочь в этом?
Большое спасибо.
РЕДАКТИРОВАТЬ:
Я нашел комментарий в аналогичную запись на SO @Travis о том, что
Распространенный подход для аннулирования токенов, когда пользователь меняет свой пароль, состоит в том, чтобы подписать токен хешем своего пароля.Таким образом, если пароль изменяется, любые предыдущие токены автоматически не проходят проверку.Вы можете расширить это до выхода из системы, включив время последнего выхода из системы в записи пользователя и используя комбинацию времени последнего выхода из системы и хэша пароля для подписи токена.Это требует поиска в БД каждый раз, когда вам нужно проверить подпись токена, но, по-видимому, вы все равно ищете пользователя
Я пытаюсь реализовать это .. Я обновлю свой пост, если онработал.В противном случае я все еще открыт для предложений.