>我正在使用 flask-jwt-extended 库为具有以下路由的 API 提供授权:
@app.route('/<string:stage>/api/v2.0/unauth/token', methods=['POST'])
def get_token(stage):
username = request.json['username']
password = request.json['password']
user = get_user(username)
if user and user.password == password:
return jsonify({'access_token': create_access_token(identity=username)}), 200
else:
abort(401)
当我提出以下 CURL 请求时
curl -H "Content-Type: application/json" -X POST -d '{"username":"android", "password":"59a07c1a-0ec9-41a0-9b96-2ff196f35f0c"}' http://0.0.0.0:5000/staging/api/v2.0/unauth/token
服务器响应
{
"msg": "Missing Authorization Header"
}
尽管事实上get_token
函数没有jwt_required
注释。我知道传递给请求的用户名和密码有效,从get_user
调用返回的对象有效,并且其他非jwt_required注释和jwt_required注释的路由按预期工作。我尝试重命名端点,甚至将其在代码中移动到其他位置,但无济于事。如何解决这个问题?
我认为您的应用程序中必须有其他事情发生。如果我们根据您那里的内容采用最少的应用程序,它可以正常工作:
from flask import Flask, jsonify, request, abort
from flask_jwt_extended import JWTManager, create_access_token
app = Flask(__name__)
app.secret_key = 'super-secret' # Change this!
# Setup the Flask-JWT-Extended extension
jwt = JWTManager(app)
@app.route('/<string:stage>/api/v2.0/unauth/token', methods=['POST'])
def get_token(stage):
username = request.json['username']
password = request.json['password']
if username == 'test' and password == 'test':
return jsonify({'access_token': create_access_token(identity=username)}), 200
else:
abort(401)
if __name__ == '__main__':
app.run()
和
$ curl -H "Content-Type: application/json" -X POST -d '{"username":"test", "password":"test"}' http://0.0.0.0:5000/staging/api/v2.0/unauth/token
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ5NTI3MjMsImlhdCI6MTQ5NDk1MTgyMywibmJmIjoxNDk0OTUxODIzLCJqdGkiOiJhMTM0ZjU0MS03NDliLTRjODctYTA1ZC02NDU0MDBlMTQ2YTIiLCJpZGVudGl0eSI6InRlc3QiLCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6e319.rXyi7p97tiplzyPq_7AtDsu0gUlrOhQmcak9bn2LOaU"
}
如果你能发布更多的代码,也许我们可以帮助追踪正在发生的事情?
此外,为了反映Sven所说的话,您永远不应该以纯文本形式存储/比较密码。如果这只是发布到堆栈溢出的示例,那么没问题。但是,如果您的真实代码相同,您应该考虑对密码进行加盐和散列。