Используйте JWT-Extended для создания веб-подписей JSON для подтверждения пользователя - PullRequest
0 голосов
/ 26 мая 2019

Я создаю RESTful API для будущего проекта. Это требует некоторой проверки учетной записи пользователя. Я реализовал процедуру подтверждения на основе токенов, ранее используя ее опасно. Но мне интересно, смогу ли я сделать то же самое с помощью JWT-Extended, поскольку он уже является частью моего приложения, и я хочу, чтобы количество зависимостей было как можно ниже.

Могу ли я просто использовать для этого обычный access_token?

Я ценю вашу помощь!

Edit:

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

@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 Ответ

1 голос
/ 26 мая 2019

РЕДАКТИРОВАТЬ

При просмотре добавленного вами кода, который работает, характер моего ответа меняется.Я думаю, что ваше решение проблемы будет считаться хорошей практикой.Основные проблемы, с которыми вы сталкиваетесь, - это безопасность, то есть никто не должен иметь возможность создавать свой собственный токен, который подтверждает значение хеш-функции, и токены должны быть персонализированы таким образом, чтобы их мог использовать только один человек, который идентифицирует пользователя.гарантии.


Поскольку вы можете закодировать столько информации, сколько хотите, в токене 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)

Подробнееинформация, посмотрите здесь

...