0

我是烧瓶的新手。我试图将刷新令牌签名密钥设置为用户散列密码。我只希望刷新令牌签名密钥包含用户散列密码而不是访问令牌。我浏览了 flask_jwt_extended 文档并在这里encode_key_loader遇到了方法。但是我不确定如何更改函数返回令牌类型的基数。这就是我到目前为止所拥有的。

@jwt.encode_key_loader
def my_key_loader(identity):
     hash = fetch_user_password(identity)
     return "somerandomsecretkey" + hash
  

我只需要弄清楚是否正在生成令牌的类型,然后我就可以返回适当的密钥。

4

1 回答 1

1

这有点骇人听闻,但您可以通过(未经测试)之类的方法来完成此操作:

@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对象将您正在制作的令牌类型存储在全局变量中,但我认为这可能会比上述解决方案更糟。

于 2021-02-14T15:57:22.530 回答