Bagikan melalui


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 redirectfungsi dan objek , , sessionrender_templaterequest, 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, , authorityclient_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 Authdiakses 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.

Langkah berikutnya