Python authlib şişesi - authorize_redirect açıkça nasıl yapılır?

Oct 26 2020

Authlib flask entegrasyonunun güzel bir şekilde çalıştığı "kod verme akışı" girişine sahibim:

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

Bazı nedenlerden dolayı yönlendirmeyi biraz daha görünür kılmaya karar verdim. Bazıları için daha aşina olmayabilecek bir giriş sayfasına yönlendirmeden önce kullanıcılara bir an için uygulamamı göster.

Şimdi bu tür işler:

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

Ancak, oturum açtıktan sonra tekrar "yetkilendirme" ye yönlendirildiğimde, authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.kaydetmediğim için bunu anlıyorum aurl['state'].

Ama bunu gerçekten nasıl yapabilirim? Authorize_redirect'in bunu nasıl yaptığını anlamakta zorlanıyorum.
Belki tamamen daha iyi bir yol vardır? Herhangi bir yardım için minnettarız!

Yanıtlar

2 lepture Oct 26 2020 at 13:23

İşinizi halletmenin iki yolu vardır:

  1. url'yi şuradan çıkar .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_dataCSRF ve diğer verileri kaydetmek için kullanın :
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'])

Bunu şuradan öğrenebilirsiniz: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51