使用 JWT-Extended 生成 JSON Web 签名以供用户确认
Use JWT-Extended to produce JSON Web Signatures for user confirmation
我正在为即将进行的项目构建 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
编辑
看到您添加的代码似乎可以正常工作,我的回答性质发生了变化。我认为您对问题的解决方案将被视为良好做法。您遇到的主要问题是安全性,即没有人能够创建自己的令牌,哈希值可以确认这一点,并且令牌应该以一种只有一个人可以使用它们的方式进行个性化,用户身份保证。
由于您可以在 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
我正在为即将进行的项目构建 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
编辑
看到您添加的代码似乎可以正常工作,我的回答性质发生了变化。我认为您对问题的解决方案将被视为良好做法。您遇到的主要问题是安全性,即没有人能够创建自己的令牌,哈希值可以确认这一点,并且令牌应该以一种只有一个人可以使用它们的方式进行个性化,用户身份保证。
由于您可以在 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