Задать вопрос
@Alex_js

Как создать одноразовый токен?

Добрый день.
Хочу добавить возможность сброса пароля на сайт Flask с помощтю JWT и пакета flask PyJWT.
На данный момент, можно несколько раз запросить письмо в котором будет ссылка с токеном и после смены пароля остальные ссылки с токеном останутся действительными. То есть так же можно будет по ним переходить и менять пароль дальше. Я же хочу сделать, что после перехода по ссылки с токеном и сброса пароля все остальные ссылки были уже недействительные(в том случае, если пользователь их много запросил).

Функции создания и проверки токена:

def get_reset_password_token(self, expires_in=600):
        return jwt.encode({'reset_password': self.id,
                           'exp': time() + expires_in},
                          app.config['SECRET_KEY'],
                          algorithm='HS256')

 @staticmethod
    def verify_reset_password_token(token):
        try:
            id = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])['reset_password']
        except:
            return
        return User.query.get(id)


Функция представления для изменения пароля:

@app.route('/reset_password/<token>', methods=['POST', 'GET'])
def reset_password(token):
    if current_user.is_authenticated:
        return redirect(url_for('/'))
    user = User.verify_reset_password_token(token)
    if not user:
        return redirect(url_for('index'))
    form = ResetPasswordForm()
    if form.validate_on_submit():
        user.set_password(form.password.data)
        db.session.commit()
        flash('Ваш пароль изменён')
        return redirect(url_for('login'))
    return render_template('reset_password.html',
                           form=form)


Это код создания и проверки токена.
Буду благодарен за любую помощь!
  • Вопрос задан
  • 427 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@gimntut
Формируй токен на основе app.config['SECRET_KEY'] и текущего хэша пароля.
После смены пароля хэш поменяется и токен станет недействительным
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы