Flask Python authlib - come eseguire esplicitamente authorize_redirect?

Oct 26 2020

Ho accesso "code grant flow" con l'integrazione del flask di authlib che funziona bene:

redirect_uri = url_for('authorize', _external=True)
return oauth.myOauth2.authorize_redirect(redirect_uri)

Per qualche motivo ho deciso di provare a rendere il reindirizzamento un po 'più visibile. Mostra agli utenti la mia app per un momento prima di reindirizzare a una pagina di accesso che potrebbe essere più insolita per alcuni.

Ora questo tipo di lavori:

redirect_uri = url_for('authorize', _external=True)
aurl = oauth.myOauth2.create_authorization_url(redirect_uri)
# what to do with aurl['state']?
return render_template('redirect.html', delay=2,
                       redirect_notice='Redirecting to login', 
                       redirect_url=aurl['url'])

Tuttavia, quando vengo reindirizzato di nuovo ad "autorizza" dopo il login, ottengo authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.che presumo sia perché non ho salvato aurl['state'].

Ma come posso farlo effettivamente? Faccio fatica a capire come lo fa authorize_redirect.
Forse c'è un modo migliore del tutto? Qualsiasi aiuto apprezzato!

Risposte

2 lepture Oct 26 2020 at 13:23

Ci sono due modi per portare a termine il tuo lavoro:

  1. estrai l'URL da .authorize_redirect:
redirect_uri = url_for('authorize', _external=True)
resp = oauth.myOauth2.authorize_redirect(redirect_uri)
url = resp.headers.get('Location')
return render_template('redirect.html', delay=2,
                       redirect_notice='Redirecting to login', 
                       redirect_url=url)
  1. utilizzare .save_authorize_dataper salvare CSRF e altri dati:
redirect_uri = url_for('authorize', _external=True)
rv = oauth.myOauth2.create_authorization_url(redirect_uri)
oauth.myOauth2.save_authorize_data(request, redirect_uri=redirect_uri, **rv)
return render_template('redirect.html', delay=2,
                       redirect_notice='Redirecting to login', 
                       redirect_url=rv['url'])

Puoi impararlo da: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51