Kolba authlib w Pythonie - jak jawnie zrobić authorize_redirect?

Oct 26 2020

Mam login „code grant flow” z integracją authlib flask:

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

Z jakiegoś powodu zdecydowałem, że chcę, aby przekierowanie było trochę bardziej widoczne. Pokaż użytkownikom moją aplikację przez chwilę przed przekierowaniem do strony logowania, która może być dla niektórych bardziej nieznana.

Teraz ten rodzaj działa:

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

Jednak gdy jestem przekierowywany z powrotem do „autoryzacji” po zalogowaniu, otrzymuję, jak authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.sądzę, dlatego, że nie zapisałem aurl['state'].

Ale jak właściwie mam to zrobić? Trudno mi się drażnić, jak to robi authorize_redirect.
Może jest w ogóle lepszy sposób? Każda pomoc doceniona!

Odpowiedzi

2 lepture Oct 26 2020 at 13:23

Istnieją dwa sposoby wykonania pracy:

  1. wyodrębnij adres URL z .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. użyj .save_authorize_datado zapisania CSRF i innych danych:
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'])

Możesz się tego nauczyć od: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51