Tutorial: Menambahkan masuk ke aplikasi web Python Flask
Tutorial ini adalah bagian ketiga dari seri tutorial yang menunjukkan pembuatan aplikasi web Python Flask dari awal dan mengintegrasikan autentikasi menggunakan platform identitas Microsoft. Dalam tutorial ini, Anda menambahkan kode untuk mengautentikasi pengguna di aplikasi yang Anda buat.
- Mengimpor modul dan konfigurasi yang diperlukan
- Membuat instans aplikasi web Flask
- Mengonfigurasi middleware ProxyFix untuk pengembangan lokal
- Menambahkan kode untuk masuk dan mengeluarkan pengguna
- Menentukan titik masuk untuk aplikasi web
Mengimpor paket dan konfigurasi yang diperlukan
Aplikasi web yang Anda buat menggunakan paket yang identity.web
dibangun di atas MSAL Python untuk mengautentikasi pengguna di aplikasi web. Untuk mengimpor identity.web
paket, kerangka kerja Flask, modul Flask, sesi Flask, dan konfigurasi aplikasi yang ditentukan dalam tutorial sebelumnya, tambahkan kode berikut ke app.py:
import identity.web
import requests
from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session
import app_config
Dalam cuplikan kode ini, Anda mengimpor redirect
fungsi dan objek , , session
render_template
request
, dan url_for
: untuk menangani permintaan web dan sesi di Flask. Anda juga mengimpor app_config
, yang berisi pengaturan konfigurasi untuk aplikasi Anda.
Membuat instans aplikasi web Flask
Setelah mengimpor modul yang diperlukan, kami menginisialisasi aplikasi web menggunakan konfigurasi di app-config
. Untuk membuat instans aplikasi web Anda, tambahkan cuplikan berikut ke app.py
:
app = Flask(__name__)
app.config.from_object(app_config)
assert app.config["REDIRECT_PATH"] != "/", "REDIRECT_PATH must not be /"
Session(app)
Dalam cuplikan kode di atas, Anda menginisialisasi aplikasi Flask baru dan memuat pengaturan konfigurasi menggunakan app.config.from_object(app_config)
. Dengan menggunakan from_object
, aplikasi mewarisi konfigurasi dari yang ditentukan dalam (app_config)
.
Anda juga melakukan pemeriksaan pernyataan untuk memastikan jalur pengalihan aplikasi Anda tidak diatur ke jalur akar ("/"). Session(app)
menginisialisasi manajemen sesi untuk aplikasi Anda, yang memungkinkan Anda menangani sesi dan menyimpan data seperti status autentikasi pengguna di beberapa permintaan.
Mengonfigurasi middleware ProxyFix untuk pengembangan lokal
Karena contoh aplikasi web berjalan di host lokal, kami menggunakan ProxyFix
middleware untuk memperbaiki skema URL dan informasi host di header permintaan. Tambahkan kode berikut untuk app.py
menerapkan ProxyFix:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
Menginisialisasi objek autentikasi
Selanjutnya, Anda menginisialisasi objek autentikasi dengan membuat instans [identity.web.Auth](https://identity-library.readthedocs.io/en/latest/#identity.web.Auth)
kelas. Anda juga meneruskan parameter session
, , authority
client_id
, dan client_credential
di konstruktor saat menginisialisasi objek Auth, sebagai berikut:
app.jinja_env.globals.update(Auth=identity.web.Auth) # Useful in template for B2C
auth = identity.web.Auth(
session=session,
authority=app.config["AUTHORITY"],
client_id=app.config["CLIENT_ID"],
client_credential=app.config["CLIENT_SECRET"],
)
Dalam cuplikan kode ini, app.jinja_env.globals.update(Auth=identity.web.Auth)
menambahkan variabel global baru bernama Auth
dan menetapkannya nilai identity.web.Auth
. Ini dapat Auth
diakses di semua templat yang dirender oleh aplikasi Flask.
Memasukkan pengguna
Alur otorisasi yang Anda buat di aplikasi ini terdiri dari dua kaki. Pada leg pertama, Anda memanggil auth.log_in
fungsi untuk memasukkan pengguna, seperti yang ditunjukkan:
@app.route("/login")
def login():
return render_template("login.html", version=__version__, **auth.log_in(
scopes=app_config.SCOPE, # Have user consent to scopes during log-in
redirect_uri=url_for("auth_response", _external=True), # Optional. If present, this absolute URL must match your app's redirect_uri registered in Microsoft Entra admin center
prompt="select_account", # Optional.
))
Saat pengguna menavigasi ke /login
URL di aplikasi Anda, Flask memanggil fungsi tampilan yang menangani permintaan untuk merender login.html
templat. Di dalam login()
, Anda memanggil auth.log_in
fungsi dengan daftar cakupan yang harus disyaratkan pengguna selama proses masuk. Anda juga menyediakan redirect_uri
dalam parameter, yang harus cocok dengan URI pengalihan aplikasi i pusat admin Microsoft Azure.
Anda dapat secara opsional menambahkan parameter seperti prompt
, yang mengontrol perilaku permintaan masuk dengan meminta autentikasi ulang, persetujuan pengguna, atau pemilihan akun di antara akun dengan sesi aktif.
Pada bagian kedua alur otorisasi, Anda menangani respons autentikasi dengan memanggil auth.complete_log_in
fungsi di dalam pengontrol redirect_uri, seperti yang ditunjukkan:
@app.route(app_config.REDIRECT_PATH)
def auth_response():
result = auth.complete_log_in(request.args)
if "error" in result:
return render_template("auth_error.html", result=result)
return redirect(url_for("index"))
Fungsi ini complete_log_in()
mengambil kamus masuk auth_response
sebagai parameter kueri. Jika berhasil, fungsi mengalihkan pengguna ke rute "indeks" menggunakan redirect(url_for("index"))
. Ini berarti pengguna telah berhasil masuk ke informasi mereka tersedia sebagai kamus yang berisi klaim dari token ID yang sudah divalidasi.
Jika hasilnya berisi kesalahan seperti yang ditentukan oleh kondisi if "error" in result:
, maka render "auth_error.html"
templat kepada pengguna.
Keluarkan pengguna
Untuk mengeluarkan pengguna dari aplikasi Flask Anda, panggil auth.log_out()
metode sebagai berikut:
@app.route("/logout")
def logout():
return redirect(auth.log_out(url_for("index", _external=True)))
Saat pengguna menavigasi ke /logout
rute URL di aplikasi, Flask memanggil fungsi keluar yang mengeluarkannya dari aplikasi saat ini. Anda juga menentukan halaman yang harus dialihkan pengguna saat keluar. Dalam cuplikan kode, kami mengalihkan pengguna ke beranda aplikasi menggunakan url_for("index", _external=True).
Menentukan titik masuk untuk aplikasi web
Setelah menerapkan logika masuk dan keluar, tambahkan titik masuk ke beranda aplikasi Anda dengan membuat index()
fungsi sebagai berikut:
@app.route("/")
def index():
if not (app.config["CLIENT_ID"] and app.config["CLIENT_SECRET"]):
# This check is not strictly necessary.
# You can remove this check from your production code.
return render_template('config_error.html')
if not auth.get_user():
return redirect(url_for("login"))
return render_template('index.html', user=auth.get_user(), version=__version__)
Fungsi index()
ini dipanggil saat pengguna menavigasi ke URL akar aplikasi("/"). Ini menangani pemeriksaan konfigurasi dan memvalidasi autentikasi pengguna sebelum merender beranda aplikasi. Ini memeriksa apakah ID klien dan rahasia klien hilang dalam konfigurasi, dan jika salah satu atau kedua nilai hilang, Flask merender "config_error.html"
templat.
Fungsi ini juga memanggil auth.get_user()
untuk memverifikasi apakah pengguna diautentikasi atau tidak. Jika pengguna tidak diautentikasi, pengguna akan mengalihkannya ke "login"
rute. Jika diautentikasi, Flask merender templat "index.html" dan meneruskan objek pengguna (diambil dari auth.get_user()
) untuk penyajian.