我正在为即将进行的项目构建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
答案 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