Используйте JWT-Extended для создания веб-подписей JSON для подтверждения пользователя
Я создаю RESTful API для предстоящего проекта. Это требует некоторой проверки учетной записи пользователя. Я реализовал процедуру подтверждения на основе токенов, ранее используя ее опасно. Но мне интересно, смогу ли я сделать то же самое с помощью JWT-Extended, поскольку он уже является частью моего приложения, и я хочу, чтобы количество зависимостей было как можно ниже.
Могу ли я просто использовать обычный access_token для этого?
Я ценю вашу помощь!
Редактировать:
Я реализовал следующие два метода, и они, кажется, работают. Я просто не уверен, считается ли это хорошей практикой.
@blueprint.route('/gen_confirmation_token', methods=['GET'])
@jwt_required
def gen_confirmation_token():
access_token = create_access_token(identity=get_jwt_identity(), user_claims={"confirm": True}, expires_delta=dt.timedelta(seconds=3600))
# TODO send a link to mail
return jsonify({"message": "confirmation token sent"}), 200
@blueprint.route('/confirm/<string:token>', methods=['GET'])
@jwt_required
def confirm_user(token):
user_identity = get_jwt_identity()
current_user = User.query.get(user_identity)
decoded_token = decode_token(token)
if decoded_token['identity'] == user_identity and decoded_token['user_claims'].get('confirm', False):
current_user.confirm()
return jsonify({"message": "user confirmed"}), 200
return jsonify({"message": "invalid confirmation token"}), 400
1 ответ
РЕДАКТИРОВАТЬ
Видя добавленный вами код, который, кажется, работает, природа моего ответа меняется. Я думаю, что ваше решение проблемы будет считаться хорошей практикой. Основные проблемы, с которыми вы сталкиваетесь, - это безопасность, то есть никто не должен иметь возможность создавать свой собственный токен, который подтверждает значение хеш-функции, и токены должны быть персонализированы таким образом, чтобы их мог использовать только один человек, который идентифицирует пользователя. гарантии.
Поскольку вы можете закодировать столько информации, сколько хотите, в токене JWT, вы также сможете хранить в нем нужную информацию. Я не уверен, о каком формате вы думали, но если вы хотите, например, сохранить шаг подтверждения, который кто-то еще должен достичь, вы можете сохранить что-то вроде следующего:
@jwt.user_claims_loader
def add_confirmation_status_to_token(user):
"""Given an identity, add the confirmation status to the token"""
return dict(status=user.confirmed_email)
Для получения дополнительной информации, посмотрите здесь