Python Authlib Flask - Wie wird authorize_redirect explizit ausgeführt?
Ich habe "Code Grant Flow" Login mit der Authlib Flask Integration funktioniert gut:
redirect_uri = url_for('authorize', _external=True)
return oauth.myOauth2.authorize_redirect(redirect_uri)
Aus irgendeinem Grund habe ich beschlossen, die Weiterleitung etwas sichtbarer zu machen. Zeigen Sie den Benutzern für einen Moment meine App, bevor Sie zu einer Anmeldeseite weiterleiten, die für einige Benutzer möglicherweise ungewohnter ist.
Nun diese Art von Arbeiten:
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'])
Wenn ich jedoch nach dem Anmelden zurück zum "Autorisieren" geleitet werde, erhalte ich das, authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.was ich vermute, weil ich nicht gespeichert habe aurl['state'].
Aber wie kann ich das eigentlich machen? Es fällt mir schwer herauszufinden, wie authorize_redirect das macht.
Vielleicht gibt es insgesamt einen besseren Weg? Jede Hilfe geschätzt!
Antworten
Es gibt zwei Möglichkeiten, um Ihre Arbeit zu erledigen:
- URL extrahieren aus
.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)
- Verwenden Sie
.save_authorize_datadiese Option, um CSRF und andere Daten zu speichern:
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'])
Sie können es lernen von: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51