0

我正在为即将到来的项目构建一个 RESTful API。这需要某种用户帐户验证。我之前使用 itsdangerous 实现了一个基于令牌的确认程序。但我想知道我是否可以通过使用 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



4

1 回答 1

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)

有关更多信息,请查看此处

于 2019-05-26T11:27:48.030 回答