2017-07-05 7 views
1

Ich habe eine API mit FlasK erstellt, wo die Authentifizierung alles funktioniert mit Flask_jwt_extended.Hinzufügen von Ressourcen mit jwt_required?

Wenn ich jedoch eine Ressource hinzufügen, die einen jwt_required Decorator hat, erhalte ich diesen Fehler.

File "/Library/Python/2.7/site-packages/flask_jwt/__init__.py", line 176, in decorator 
    _jwt_required(realm or current_app.config['JWT_DEFAULT_REALM']) 
KeyError: 'JWT_DEFAULT_REALM' 

Beispiel Ressource:

class Endpoint(Resource): 

    @jwt_required() 
    def get(self): 
     return {"State": "Success"} 

Initialisierung der App:

app = Flask(__name__) 
api = Api(app) 

die Ressource hinzu:

api.add_resource(resource_class, "/myEndpoint") 

Die einzige Art, wie ich es Arbeit bekommen können, ist zu Definieren Sie die Endpoint-Klasse in derselben Datei als die API.

Ich denke, ich brauche irgendwie das Realm in die Endpunktklasse zu übergeben und den optionalen Parameter on jwt_required zu verwenden, um den Realm festzulegen.

Antwort

0

das Problem entdeckt, in der Ressource ich die jwt_required wurde importieren:

von flask_jwt_extended Import jwt_required

Jedoch habe ich aus der Klasse jwt_required importieren erforderlich, dass bei JWT initialisiert wurde.

1

Ich glaube, Sie haben vergessen, JWT Instanz zu initialisieren. Sie können es auf 2 Arten tun. Erste:

from flask import Flask 
from flask_jwt import jwt_required, JWT 
from flask_restful import Resource, Api 

class Endpoint(Resource): 

    @jwt_required() 
    def get(self): 
     return {"State": "Success"} 

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'super-secret' 

def authenticate(username, password): 
    # you should find user in db here 
    # you can see example in docs 
    user = None 
    if user: 
     # do something 
     return user 

def identity(payload): 
    # custom processing. the same as authenticate. see example in docs 
    user_id = payload['identity'] 
    return None 
# here what you need 
jwt = JWT(app, authenticate, identity) 
api = Api(app) 

api.add_resource(Endpoint, '/myEndpoint') 

if __name__ == '__main__': 
    app.run(debug=True) 
    app.run(host='0.0.0.0') 

Der zweite Weg ist unsere Konfiguration Anwendung aktualisieren. Nur ändern:

jwt = JWT(app, authenticate, identity) 

An:

app.config.update(
    JWT=JWT(app, authenticate, identity) 
) 

Lassen Sie uns unsere Route öffnen. Sie werden sehen:

{ 
    "description": "Request does not contain an access token", 
    "error": "Authorization Required", 
    "status_code": 401 
} 

Ich hoffe, es hilft.

+0

Danke Danila, JWT wurde initialisiert, ich habe es nicht in meiner Probe gezeigt. –

Verwandte Themen