8

Ich versuche Benutzern zu erlauben, sich über einen separaten Web-Service bei ihrer Flask-App mit ihren Konten anzumelden. Ich kann die API dieses Web-Service kontaktieren und ein Sicherheits-Token erhalten. Wie verwende ich dieses Token, um Benutzer zu authentifizieren, sodass sie Zugriff auf eingeschränkte Ansichten haben?Wie implementieren Sie Token-Authentifizierung in Flask?

Ich brauche nicht Benutzer in meine eigene Datenbank zu speichern. Ich möchte sie nur für eine Sitzung authentifizieren. Ich glaube, dass dies mit Flask-Security und dem @auth_token_required Decorator gemacht werden kann, aber die Dokumentation ist nicht sehr detailliert und ich bin mir nicht sicher, wie ich das umsetzen soll.

EDIT:

Hier ist ein Codebeispiel:

@main.route("/login", methods=["GET", "POST"]) 
def login(): 

    payload = {"User": "john", "Password": "password123"} 
    url = "http://webserviceexample/api/login" 
    headers = {'content-type': 'application/json'}) 

    #login to web service 
    r = requests.post(url, headers=headers, json=payload) 
    response = r.json() 

    if (r.status_code is 200): 
     token = response['user']['authentication_token'] 

     # allow user into protected view 

    return render_template("login.html", form=form) 


@main.route('/protected') 
@auth_token_required 
def protected(): 
    return render_template('protected.html') 
+0

Sie müssen die Benutzer mit dem Token speichern; und bestätigen Sie die Gültigkeit des Tokens für den Dienst. Andernfalls müssen Sie die Besucher jedes Mal gegen den 3rd-Party-Service authentifizieren, wenn sie starten. –

+0

Mit jeder Zeit meinen Sie für jede Sitzung? Wenn ja, ist das in Ordnung, dass sie sich erneut authentifizieren müssten. Gibt es einen Grund, dass dies ein Problem wäre? – Amerikaner

Antwort

11

Hey Amedrikaner!

Es sieht so aus, als wäre Ihr Anwendungsfall einfach genug, um dies selbst zu implementieren. Im folgenden Code werde ich Ihr Token in der Benutzersitzung speichern und einen neuen Wrapper einchecken. Lassen Sie uns, indem wir unsere eigenen Wrapper beginnen, habe ich diese in der Regel nur in einer wrappers.py Datei kann aber Sie können es platzieren, wo Sie möchten.

def require_api_token(func): 
    @wraps(func) 
    def check_token(*args, **kwargs): 
     # Check to see if it's in their session 
     if 'api_session_token' not in session: 
      # If it isn't return our access denied message (you can also return a redirect or render_template) 
      return Response("Access denied") 

     # Otherwise just send them where they wanted to go 
     return func(*args, **kwargs) 

    return check_token 

Cool!

Jetzt haben wir unseren Wrapper implementiert, wir können einfach sein Token in der Sitzung speichern. Super einfach. Lassen Sie uns ändern Ihre Funktion ...

@main.route("/login", methods=["GET", "POST"]) 
def login(): 

    payload = {"User": "john", "Password": "password123"} 
    url = "http://webserviceexample/api/login" 
    headers = {'content-type': 'application/json'}) 

    #login to web service 
    r = requests.post(url, headers=headers, json=payload) 
    response = r.json() 

    if (r.status_code is 200): 
     token = response['user']['authentication_token'] 

     # Move the import to the top of your file! 
     from flask import session 

     # Put it in the session 
     session['api_session_token'] = token 

     # allow user into protected view 

    return render_template("login.html", form=form) 

Jetzt können Sie die geschützten Ansichten überprüfen Sie die @require_api_token Wrapper, so ...

@main.route('/super_secret') 
@require_api_token 
def super_secret(): 
    return "Sssshhh, this is a secret" 

EDIT Woah! Ich habe vergessen zu erwähnen, dass du deinen SECRET_KEY in deiner App-Konfiguration einstellen musst.

Nur config.py Datei mit secret_key = "SOME_RANDOM_STRING" tun wird. Dann laden Sie es mit ...

main.config.from_object(config) 
+0

Das ist genau das, was ich suchte. Danke F Boucaut! – Amerikaner

+0

Brauchen wir nur diese zwei Elemente oder sollte es keine andere Funktion geben, um Benutzeranmeldeinformationen gegen die Datenbank zu verifizieren? –

+0

@EvanBurbidge Sorry für die späte Antwort. Diese Implementierung wurde speziell für die Authentifizierung von Benutzern gegen eine externe API an anderer Stelle entwickelt. Am liebsten möchten Sie einem Standard-Benutzer-Login-Flow folgen, lesen Sie diesen Link für mehr https://flask-login.readthedocs.io/en/latest/ –