Python authlib flask - как явно сделать authorize_redirect?

Oct 26 2020

У меня есть логин "поток предоставления кода" с интеграцией фляги authlib, которая прекрасно работает:

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

По какой-то причине я решил, что хочу сделать редирект более заметным. Покажите пользователям мое приложение на мгновение, прежде чем перенаправлять на страницу входа, которая может быть для некоторых более незнакома.

Сейчас такого рода работы:

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

Однако, когда меня перенаправляют обратно на «авторизацию» после входа в систему, я получаю, authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.что, как я полагаю, происходит потому, что я не сохранял aurl['state'].

Но как я могу это сделать? Мне сложно понять, как это делает authorize_redirect.
Может, вообще есть способ лучше? Любая помощь приветствуется!

Ответы

2 lepture Oct 26 2020 at 13:23

Есть два способа выполнить свою работу:

  1. извлечь URL из .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. используйте .save_authorize_dataдля сохранения CSRF и других данных:
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'])

Вы можете узнать это из: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51