使用 Flask_jwt_extended 将刷新令牌签名密钥设置为用户的哈希密码
Setting Refresh Token Signing Key to User's Hashed Password Using Flask_jwt_extended
我是 Flask 新手。我试图将刷新令牌签名密钥设置为用户散列密码。我只希望刷新令牌签名密钥包含用户哈希密码而不是访问令牌。我浏览了 flask_jwt_extended 文档并发现了 encode_key_loader
方法 here。
但是我不确定如何更改令牌类型的函数 returns 基础。这是我目前所拥有的。
@jwt.encode_key_loader
def my_key_loader(identity):
hash = fetch_user_password(identity)
return "somerandomsecretkey" + hash
我只需要弄清楚生成的令牌类型,然后我就可以 return 适当的密钥。
这有点老套,但您可以通过类似(未测试)的方法来完成此操作:
@jwt.user_identity_loader
def user_identity_lookup(identity):
return identity['user'].id
@jwt.encode_key_loader
def custom_encode_key(identity):
secret = "<YOUR_NORMAL_JWT_ENCODE_KEY>"
if identity['token_type'] == "access":
return secret
else:
return secret + identity['user'].hashed_password
@jwt.decode_key_loader
def custom_encode_key(jwt_headers, jwt_payload):
secret = "<YOUR_NORMAL_JWT_ENCODE_KEY>"
if jwt_payload['type'] == "access":
return secret
else:
user = User.query.filter_by(id=jwt_payload["sub"]).one()
return secret + user.hashed_password
@app.route("/login", methods=["POST"])
def login():
user = User.query.filter_by(username='example').one()
access_token = create_access_token({'user': user, 'token_type': 'access'})
refresh_token = create_access_token({'user': user, 'token_type': 'refresh'})
return jsonify(access_token=access_token, refresh_token=refresh_token)
您也可以使用 Flask.g
对象来存储您在全局变量中制作的令牌类型,但我认为这可能比上述解决方案更糟糕。
我是 Flask 新手。我试图将刷新令牌签名密钥设置为用户散列密码。我只希望刷新令牌签名密钥包含用户哈希密码而不是访问令牌。我浏览了 flask_jwt_extended 文档并发现了 encode_key_loader
方法 here。
但是我不确定如何更改令牌类型的函数 returns 基础。这是我目前所拥有的。
@jwt.encode_key_loader
def my_key_loader(identity):
hash = fetch_user_password(identity)
return "somerandomsecretkey" + hash
我只需要弄清楚生成的令牌类型,然后我就可以 return 适当的密钥。
这有点老套,但您可以通过类似(未测试)的方法来完成此操作:
@jwt.user_identity_loader
def user_identity_lookup(identity):
return identity['user'].id
@jwt.encode_key_loader
def custom_encode_key(identity):
secret = "<YOUR_NORMAL_JWT_ENCODE_KEY>"
if identity['token_type'] == "access":
return secret
else:
return secret + identity['user'].hashed_password
@jwt.decode_key_loader
def custom_encode_key(jwt_headers, jwt_payload):
secret = "<YOUR_NORMAL_JWT_ENCODE_KEY>"
if jwt_payload['type'] == "access":
return secret
else:
user = User.query.filter_by(id=jwt_payload["sub"]).one()
return secret + user.hashed_password
@app.route("/login", methods=["POST"])
def login():
user = User.query.filter_by(username='example').one()
access_token = create_access_token({'user': user, 'token_type': 'access'})
refresh_token = create_access_token({'user': user, 'token_type': 'refresh'})
return jsonify(access_token=access_token, refresh_token=refresh_token)
您也可以使用 Flask.g
对象来存储您在全局变量中制作的令牌类型,但我认为这可能比上述解决方案更糟糕。