使用JWT扩展来生成JSON Web签名以供用户确认



我正在为即将到来的项目构建一个安息的API。这需要某种用户帐户验证。我先前使用其危险的确认程序实施了基于令牌的确认程序。但是我想知道我可以通过使用JWT扩展而实现同样的工作,因为它已经是我的应用程序的一部分,并且我想保持依赖次数的数量尽可能低。

我可以为此使用普通的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

edit

看到您添加的代码(似乎在起作用(,答案的性质会改变。我认为您解决问题的解决方案将被视为好实践。您遇到的主要问题是安全性,即没有人应该能够创建自己的令牌,哈希值可以确认这些令牌,并且应该以一个人可以使用它们的方式来个性化代币,以使用户身份使用它们。保证。


由于您可以在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)

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

最新更新