Python authlib flask - como fazer authorize_redirect explicitamente?
Eu tenho o login "code grant flow" com a integração authlib flask funcionando bem:
redirect_uri = url_for('authorize', _external=True)
return oauth.myOauth2.authorize_redirect(redirect_uri)
Por algum motivo, decidi tentar tornar o redirecionamento um pouco mais visível. Mostre aos usuários meu aplicativo por um momento antes de redirecionar para uma página de login que pode ser mais desconhecida para alguns.
Agora, este tipo de trabalho:
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'])
No entanto, quando sou redirecionado para "autorizar" após o login, recebo o authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.que presumo que seja porque não salvei aurl['state'].
Mas como posso realmente fazer isso? Estou tendo dificuldade em descobrir como authorize_redirect faz isso.
Talvez haja uma maneira totalmente melhor? Qualquer ajuda apreciada!
Respostas
Existem duas maneiras de fazer seu trabalho:
- extrair 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)
- use
.save_authorize_datapara salvar CSRF e outros dados:
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'])
Você pode aprender com: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51