2015-03-14 11 views
6

Con l'arresto imminente del supporto di Google per OpenID 2, chiunque utilizzi una libreria conveniente come Flask-Googleauth dovrà migrare. C'è una libreria Flask per OpenID Connect, chiamata flask-oidc. Sfortunatamente, non sembrano esserci informazioni su come usarlo. Ho cercato domande SO contrassegnate con flask e openid-connect, ma ho trovato zero, quindi questa domanda.Basic Flask OpenID Connect esempio

Ecco quello che ho messo insieme come uso proof-of-concept di flask-oidc. Si basa su flask-oidc's app.py file:

""" 
Flask app for testing the OpenID Connect extension. 
""" 
from flask import Flask 
from flask.ext.oidc import OpenIDConnect 

def index(): 
    return "too many secrets", 200, { 
     'Content-Type': 'text/plain; charset=utf-8' 
    } 

def create_app(config, oidc_overrides=None): 
    app = Flask(__name__) 
    app.config.update(config) 
    if oidc_overrides is None: 
     oidc_overrides = {} 
    oidc = OpenIDConnect(app, **oidc_overrides) 
    app.route('/')(oidc.check(index)) 
    return app 

if __name__ == '__main__': 
    APP = create_app({ 
     'OIDC_CLIENT_SECRETS': './client_secrets.json', 
     'SECRET_KEY': 'secret'}) 
    APP.run(host="127.0.0.1", port=8080, debug=True) 

Dopo la registrazione la mia domanda come descritto here, questo invia con successo l'utente di Google per l'autenticazione, e li restituisce a http://127.0.0.1:8080/oidc_callback, che poi li reindirizza a https://127.0.0.1:8080/, ma che poi reindirizza l'utente indietro a Google per l'autenticazione, creando un ciclo di reindirizzamento.

La mia domanda, ovviamente, è semplice: come posso ottenere un utente autenticato per vedere quella pagina indice?

risposta

5

Il problema è che è la creazione di oidc_callback correttamente un cookie di autenticazione (chiamato oidc_id_token) e reindirizzamento a index, ma index non può recuperare il cookie perché l'applicazione è ospitato su HTTP, e il cookie ha il set Secure flag, in modo che il il browser non è disposto a inviarlo di nuovo all'app su HTTP.

La soluzione è (per scopi di sviluppo locali soltanto!) Per spegnere la bandiera sicuro, impostando la voce config OpenIDConnect OIDC_ID_TOKEN_COOKIE_SECURE-False:

if __name__ == '__main__': 
    APP = create_app({ 
     'OIDC_CLIENT_SECRETS': './client_secrets.json', 
     'OIDC_ID_TOKEN_COOKIE_SECURE': False, 
     'SECRET_KEY': 'secret'}) 
    APP.run(host="127.0.0.1", port=8080, debug=True) 
+0

Grazie per questo. Ho successo eseguendo la suite Nosetest in flask-oidc, ma ho ripetutamente ricevuto un errore di disallineamento redirect_uri da Google, con il messaggio "http: // localhost: 8080/oidc_callback non corrispondente a un URI di reindirizzamento registrato." La suite di test client.secrets elenca l'URI di reindirizzamento come http: // localhost: 5000/oauth2callback. Nessuno dei due ha funzionato per me, perché li stavo modificando e eseguendo il codice pochi minuti dopo. Quando ho cambiato le credenziali e re-cercato ore dopo, ha funzionato. –