如何将刷新令牌发布到 Flask JWT Extended?

How to POST the refresh token to Flask JWT Extended?

提问人:Johnny John Boy 提问时间:3/11/2019 更新时间:10/22/2022 访问量:9800

问:

我正在尝试从此处的代码中刷新 JWT 令牌。问题在于如何通过刷新获取新令牌。

这有效:

curl http://127.0.0.1:5000/protected
{"msg":"Missing Authorization Header"}

这有效,我得到我的令牌并将其放入 ACCESS

curl -H "Content-Type: application/json" -X POST   -d '{"username":"test","password":"test"}' http://localhost:5000/login

这有效,我得到了我的用户名

curl -H "Authorization: Bearer $ACCESS" http://localhost:5000/protected

但是,当令牌过期时,如何使用刷新令牌和/或访问令牌获取 curl 以获取新的访问令牌?我尝试了很多 POST,但似乎没有任何效果:

https://flask-jwt-extended.readthedocs.io/en/latest/refresh_tokens.html

from flask import Flask, jsonify, request
from flask_jwt_extended import (
    JWTManager, jwt_required, create_access_token,
    jwt_refresh_token_required, create_refresh_token,
    get_jwt_identity
)

app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)


@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if username != 'test' or password != 'test':
        return jsonify({"msg": "Bad username or password"}), 401

    # Use create_access_token() and create_refresh_token() to create our
    # access and refresh tokens
    ret = {
        'access_token': create_access_token(identity=username),
        'refresh_token': create_refresh_token(identity=username)
    }
    return jsonify(ret), 200


# The jwt_refresh_token_required decorator insures a valid refresh
# token is present in the request before calling this endpoint. We
# can use the get_jwt_identity() function to get the identity of
# the refresh token, and use the create_access_token() function again
# to make a new access token for this identity.
@app.route('/refresh', methods=['POST'])
@jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    ret = {
        'access_token': create_access_token(identity=current_user)
    }
    return jsonify(ret), 200


@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
    username = get_jwt_identity()
    return jsonify(logged_in_as=username), 200


if __name__ == '__main__':
    app.run()
python flask flask-jwt-extended

评论

1赞 Manjitha Teshara 11/27/2019
如果我想在 Jwt 令牌设置时间渲染模板,该怎么做?
0赞 Manjitha Teshara 11/27/2019
我的意思是我可以像这样使用代码吗return jsonify(ret),200,render_template('home.html')
0赞 Johnny John Boy 11/28/2019
你为什么不问一个新问题?这与这里提出的问题无关。
0赞 Manjitha Teshara 11/28/2019
我问,你对此有什么想法吗?stackoverflow.com/questions/59082689/......

答:

8赞 vimalloc 3/11/2019 #1

尝试

curl -H "Authorization: Bearer $REFRESH" -X POST http://localhost:5000/refresh

评论

0赞 Johnny John Boy 3/11/2019
我试过了这个,但遇到了错误。这实际上是因为我错误地复制了刷新令牌。感谢您的帮助。
0赞 shanu khera 9/4/2020 #2

对我来说,只有这才有效,两者都是必需的 - 发布数据和身份验证标头。

 curl -X POST -H "Content-Type: Application/json" -H "Authorization: Bearer $REFRESH" -d "{\"refresh_token\":\"$REFRESH\"}" http://localhost:5000/refresh
-2赞 Eduardo Andres Chavarria Rey 10/22/2022 #3

首先,在创建新用户时,您应该确保您同时创建了access_key和refresh_key(有 flask-jwt-extended 函数)。

然后,您必须创建一个终结点,这需要refresh_key(通过 @jwt.required(refresh=True))。这说:专门给我刷新键。

终结点应如下所示:

@blp.route("/refresh") # Route
class TokenRefresh(MethodView): 
    @jwt_required(refresh=True) # Requiring the refresh_token
    def post(self):
        current_user = get_jwt_identity() # Obtaining the ID, through the refresh token
        new_token = create_access_token(identity=current_user, fresh=False)
        return {"access_token":new_token}

这将为您提供新的access_token。

评论

0赞 PirateNinjas 10/26/2022
这并不能真正帮助提问者 - 如果你看看其他答案,这里不需要实现任何新的东西。