未使用jwt_required

时间:2017-05-16 14:51:40

标签: python jwt flask-jwt

我使用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"
}

尽管jwt_required函数没有get_token注释。我知道传递给请求的用户名和密码是有效的,从get_user调用返回的对象是有效的,其他非jwt_required-annotated和jwt_required-annotated路由按预期工作。我已经尝试重命名端点,甚至将代码中的代码移到另一个地方但无济于事。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为您的应用程序中必须有其他内容。如果我们根据您的具体情况采取最低限度的应用程序,它可以正常工作:

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所说的内容,你绝不应该以纯文本形式存储/比较密码。如果这只是发布到stackoverflow的一个例子,那么没问题。但是如果你的真实代码是相同的,你应该考虑对你的密码进行腌制和散列。