8

Sto tentando di consentire agli utenti di accedere all'app Flask utilizzando i loro account da un servizio Web separato. Posso contattare l'API di questo servizio web e ricevere un token di sicurezza. Come posso utilizzare questo token per autenticare gli utenti in modo che possano accedere a viste con restrizioni?Come si implementa l'autenticazione del token in Flask?

Non è necessario salvare gli utenti nel mio database. Voglio solo autenticarli per una sessione. Credo che questo possa essere fatto usando Flask-Security e il decoratore @auth_token_required ma la documentazione non è molto dettagliata e non sono sicuro di come implementarla.

EDIT:

Ecco un esempio di codice:

@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

È necessario memorizzare gli utenti con il token; e confermare la validità del token contro il servizio. Altrimenti dovrai autenticare i visitatori ogni volta contro il servizio di terze parti ogni volta che iniziano. –

+0

Ogni volta intendi per ogni sessione? Se è così, va bene che avrebbero dovuto autenticarsi di nuovo. C'è una ragione per cui questo sarebbe un problema? – Amerikaner

risposta

11

Hey there Amedrikaner!

Sembra che il vostro caso d'uso sia abbastanza semplice da consentirci di implementarlo da soli. Nel codice qui sotto, memorizzerò il tuo token nella sessione degli utenti e verificherò un nuovo wrapper. Iniziamo creando il nostro wrapper, di solito li metto in un file wrappers.py ma puoi posizionarlo dove preferisci.

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!

Ora che abbiamo implementato il nostro wrapper, possiamo semplicemente salvare il loro token nella sessione. Super semplice. Andiamo a modificare la funzione ...

@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) 

Ora è possibile controllare la vista protette utilizzando l'involucro @require_api_token, come questo ...

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

EDIT Woah! Ho dimenticato di menzionare che è necessario impostare SECRET_KEY nella configurazione delle app.

Solo un file config.py con SECRET_KEY = "SOME_RANDOM_STRING" funzionerà. Quindi caricarlo con ...

main.config.from_object(config) 
+0

Questo è esattamente quello che stavo cercando. Grazie F Boucaut! – Amerikaner

+0

Abbiamo solo bisogno di questi due elementi o non dovrebbe esserci un'altra funzione per verificare le credenziali dell'utente rispetto al database? –

+0

@EvanBurbidge Ci scusiamo per la risposta tardiva. Questa implementazione era specifica per autenticare gli utenti da un'API esterna altrove. Molti preferiscono seguire un flusso di login standard per gli utenti, controlla questo link per maggiori informazioni su https://flask-login.readthedocs.io/en/latest/ –

Problemi correlati