2017-05-16 83 views
0

註釋我使用的燒瓶JWT擴展庫來用於與下列路線的API提供授權:燒瓶路由請求授權報頭時不與jwt_required

@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註釋和jwt_required註釋的路由按預期工作。我嘗試重命名端點,甚至將它移到代碼中,但是無濟於事。這怎麼解決?

+0

您確定沒有其他路線符合您的要求嗎? –

+0

我是。搜索'token'只會提取這個函數,並且改變路由的名字也不能解決問題。 – sjyn

+0

單靠這一點並不多,因爲它可以被解釋爲一個論點。我建議在'flask shell'中運行'app.url_map.match(「/ staging/api/v2.0/unauth/token」,method =「POST」)'並且看看它出現了什麼。 –

回答

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的示例,那麼沒有問題。但是如果你的真實代碼是相同的,你應該研究醃製和散列你的密碼。

+0

謝謝大家的幫助。原來調用'get_user'導致了這個問題。我將該方法重命名爲'get_user_by_username',它可以工作。 – sjyn