Flacon authlib Python - Comment faire explicitement authorize_redirect?

Oct 26 2020

J'ai une connexion "code grant flow" avec l'intégration du flacon authlib qui fonctionne bien:

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

Pour une raison quelconque, j'ai décidé d'essayer de rendre la redirection un peu plus visible. Montrez aux utilisateurs mon application pendant un moment avant de rediriger vers une page de connexion qui peut être plus inconnue pour certains.

Maintenant, ce genre de travaux:

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'])

Cependant, lorsque je suis redirigé vers «autoriser» après la connexion, j'obtiens authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.ce que je présume parce que je n'ai pas enregistré aurl['state'].

Mais comment puis-je faire ça? J'ai du mal à comprendre comment authorize_redirect le fait.
Peut-être existe-t-il un meilleur moyen? Toute aide appréciée!

Réponses

2 lepture Oct 26 2020 at 13:23

Il existe deux façons de faire votre travail:

  1. extraire l'url de .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. utiliser .save_authorize_datapour enregistrer CSRF et d'autres données:
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'])

Vous pouvez l'apprendre de: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51