Matraz de authlib de Python: ¿cómo hacer Authorize_redirect explícitamente?

Oct 26 2020

Tengo un inicio de sesión de "flujo de concesión de código" con la integración del matraz authlib funcionando bien:

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

Por alguna razón, decidí que quería intentar que la redirección fuera un poco más visible. Muestre a los usuarios mi aplicación por un momento antes de redirigirlos a una página de inicio de sesión que puede ser más desconocida para algunos.

Ahora bien, este tipo de obras:

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

Sin embargo, cuando me redirigen de nuevo a "autorizar" después de iniciar sesión, obtengo authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.lo que supongo que es porque no guardé aurl['state'].

Pero, ¿cómo puedo hacer eso? Estoy teniendo dificultades para averiguar cómo lo hace authorize_redirect.
¿Quizás haya una forma mejor? ¡Cualquier ayuda apreciada!

Respuestas

2 lepture Oct 26 2020 at 13:23

Hay dos formas de hacer su trabajo:

  1. extraer 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. utilizar .save_authorize_datapara guardar CSRF y otros datos:
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'])

Puedes aprenderlo de: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51