使用JWT-Extended生成JSON Web签名以进行用户确认

时间:2019-05-26 10:49:38

标签: python flask flask-jwt-extended itsdangerous

我正在为即将进行的项目构建RESTful API。这需要某种用户帐户验证。我以前使用了它的危险实现了基于令牌的确认程序。但是我想知道是否可以通过使用JWT-Extended实现相同的功能,因为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 个答案:

答案 0 :(得分: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)

有关更多信息,请查看here