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

#python #flask #authlib

#python #flask #authlib

Вопрос:

У меня есть вход в систему «code grant flow» с интеграцией authlib flask, которая работает хорошо:

 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 это делает.
Может быть, есть лучший способ вообще? Любая помощь приветствуется!

Ответ №1:

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

  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

Комментарии:

1. Самый превосходный 🙂 Я должен был подумать, чтобы проверить ответ. Я думаю, 2. было бы более «правильным», но мне нравится 1. для простоты. На самом деле у меня был «def authorize_redirect ()» прямо передо мной прошлой ночью, но почему-то не увидел, как использовать save_authorize_data()!