Flask authlib Python - bagaimana melakukan authorize_redirect secara eksplisit?

Oct 26 2020

Saya memiliki login "code grant flow" dengan integrasi flask authlib yang bekerja dengan baik:

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

Untuk beberapa alasan saya memutuskan saya ingin mencoba membuat pengalihan sedikit lebih terlihat. Tunjukkan aplikasi saya kepada pengguna sejenak sebelum mengalihkan ke halaman login yang mungkin lebih asing bagi sebagian orang.

Sekarang jenis pekerjaan ini:

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

Namun, ketika saya dialihkan kembali ke "otorisasi" setelah login, saya mendapatkan authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.yang saya kira karena saya tidak menyimpan aurl['state'].

Tapi bagaimana saya bisa melakukan itu? Saya kesulitan menjelaskan cara authorize_redirect melakukannya.
Mungkin ada cara yang lebih baik sama sekali? Setiap bantuan dihargai!

Jawaban

2 lepture Oct 26 2020 at 13:23

Ada dua cara untuk menyelesaikan pekerjaan Anda:

  1. ekstrak url dari .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. gunakan .save_authorize_datauntuk menyimpan CSRF dan data lainnya:
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'])

Anda dapat mempelajarinya dari: https://github.com/lepture/authlib/blob/master/authlib/integrations/flask_client/remote_app.py#L51