Как принудительно истечь токен после его использования (до истечения времени истечения, установленного для токена с использованием его опасной библиотеки в python)

Мой вариант использования заключается в создании токена для сброса пароля API. Что я делаю с его опасной библиотекой на python. https://pythonhosted.org/itsdangerous/.

Этот токен (в ссылке сброса пароля) пересылается по электронной почте клиенту, токен имеет ограничение по времени истечения, которое подтверждается, и после этого сброс пароля может пройти успешно.

Проблема здесь заключается в том, что после успешного сброса пароля, как я могу убедиться, что тот же токен (ссылка электронной почты) не может быть снова использован в течение срока действия. Я вижу, что его опасно имеет URLSafeTimedSerializer, который помогает оценить на этапе проверки того, сколько лет токену. С другой стороны, TimedJSONWebSignatureSerializer помогает установить время истечения при создании токена. Пожалуйста, проверьте прикрепленный кусок кода.

Есть ли лучший способ принудительно истечь токен? Если нет, то каким будет лучший способ сохранить состояние токена, который он использовал?

import itsdangerous

key = "test"

# signer = itsdangerous.URLSafeTimedSerializer(key)
signer = itsdangerous.TimedJSONWebSignatureSerializer(key, expires_in=5)
email = "email@test.com"

# token = email  # to be used with URLSafeTimedSerializer
token = signer.dumps({"email": email})

print token

# print signer.loads(token, max_age=5) # to be used with URLSafeTimedSerializer
print str(signer.loads(token)["email"]) # to be used with TimedJSONWebSignatureSerializer

1 ответ

Как только ваш токен сгенерирован и подписан, он остается в силе до истечения срока его действия. Вы не можете изменить это больше. Имея это в виду, это также означает, что вы не можете изменить какую-либо его полезную нагрузку после ее подписания, в противном случае она будет считаться недействительной (из-за неверной подписи).

Однако вы можете сгенерировать уникальный ключ ("some_key"), как только вы сгенерируете свой токен и сохраните ключ в своей базе данных. В итоге полезная нагрузка токенов, которая будет выдана пользователю, может выглядеть так: {"email": email, "reset_key": "some_key"},

Каждый раз, когда кто-то пытается восстановить свой пароль, вы сначала просто проверяете этот ключ, чтобы разрешить или отклонить запрос.

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

Надеюсь, это поможет!

Я понимаю, что это запоздалый ответ, поэтому добавлен в интересах других, кто нашел этот вопрос.

Другой подход может заключаться в использовании логической переменной сеанса, такой какtokenused и установите это на Trueкак только токен был десериализован; таким образом делая недействительным использование токена.

Например, используя session объект в Flask:

    uid = {}
    try:
        if not session['tokenused']:
            session['tokenused'] = True
            s = Serializer(app.config['SECRET_KEY'])
            uid = s.loads(token)
    except Exception as err:
        errors.internal_server_error(err)
    return uid
Другие вопросы по тегам