Aracılığıyla paylaş


Öğretici: Python Flask web uygulamasına oturum açma ekleme

Bu öğretici, sıfırdan Python Flask web uygulaması oluşturmayı ve Microsoft kimlik platformu kullanarak kimlik doğrulamasını tümleştirmeyi gösteren öğretici serisinin üçüncü bölümüdür. Bu öğreticide, oluşturduğunuz uygulamada kullanıcıların kimliğini doğrulamak için kod eklersiniz.

  • Gerekli modülleri ve yapılandırmayı içeri aktarma
  • Flask web uygulamasının örneğini oluşturma
  • Yerel geliştirme için ProxyFix ara yazılımını yapılandırma
  • Oturum açmak ve kullanıcıları oturumu kapatmak için kod ekleme
  • Web uygulaması için giriş noktası tanımlama

Gerekli paketleri ve yapılandırmaları içeri aktarma

Derlediğiniz web uygulaması, web uygulamalarında kullanıcıların kimliğini doğrulamak için MSAL Python'ın üzerinde oluşturulan paketi kullanır identity.web . Paketi, Flask çerçevesini identity.web , Flask modüllerini, Flask oturumunu ve önceki öğreticide tanımlanan uygulama yapılandırmalarını içeri aktarmak için app.py aşağıdaki kodu ekleyin:

import identity.web
import requests
from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session

import app_config

Bu kod parçacığında, Flask'te web isteklerini ve url_foroturumlarını işlemek için , requestrender_template, , sessionve : işlevlerini ve nesnelerini içeri aktarırsınızredirect. Ayrıca, uygulamanızın yapılandırma ayarlarını içeren öğesini de içeri aktarırsınız app_config.

Flask web uygulamasının bir örneğini oluşturma

Gerekli modülleri içeri aktardıktan sonra içindeki yapılandırmaları app-configkullanarak web uygulamasını başlatırız. Web uygulamanızın bir örneğini oluşturmak için aşağıdaki kod parçacığını öğesine app.pyekleyin:

app = Flask(__name__)
app.config.from_object(app_config)
assert app.config["REDIRECT_PATH"] != "/", "REDIRECT_PATH must not be /"
Session(app)

Yukarıdaki kod parçacığında yeni bir Flask uygulaması başlatır ve kullanarak app.config.from_object(app_config)yapılandırma ayarlarını yüklersiniz. kullanarak from_object, uygulama içinde (app_config)belirtilen yapılandırmaları devralır.

Ayrıca, uygulamanızın yeniden yönlendirme yolunun kök yola ("/") ayarlı olmadığından emin olmak için bir onay denetimi gerçekleştirirsiniz. Session(app) , oturumları işlemenize ve birden çok istekte kullanıcı kimlik doğrulaması durumları gibi verileri depolamanıza olanak tanıyan uygulamanız için oturum yönetimini başlatır.

Yerel geliştirme için ProxyFix ara yazılımını yapılandırma

Örnek web uygulaması yerel ana bilgisayarda çalıştığından ProxyFix , istek üst bilgilerindeki URL düzenini ve konak bilgilerini düzeltmek için ara yazılımı kullanırız. ProxyFix uygulamak için app.py aşağıdaki kodu ekleyin:

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

Kimlik doğrulama nesnesini başlatma

Ardından, sınıfının bir örneğini [identity.web.Auth](https://identity-library.readthedocs.io/en/latest/#identity.web.Auth) oluşturarak bir kimlik doğrulama nesnesi başlatırsınız. Ayrıca, Auth nesnesini başlatırken oluşturucuda , authority, client_idve client_credential parametrelerini sessionde aşağıdaki gibi geçirirsiniz:

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"],
)

Bu kod parçacığında adlı app.jinja_env.globals.update(Auth=identity.web.Auth)Auth yeni bir genel değişken ekler ve değerine identity.web.Authatar. Bu, Flask uygulaması tarafından işlenen tüm şablonlarda erişilebilir hale getirir Auth.

Oturum açma kullanıcıları

Bu uygulamada oluşturduğunuz yetkilendirme akışı iki ayakdan oluşur. İlk ayakta, kullanıcılarda oturum açmak için işlevini aşağıdaki gibi çağırırsınız auth.log_in :

@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.
        ))

Kullanıcı uygulamanızdaki URL'ye /login gittiği zaman Flask, şablonu işleme login.html isteğini işleyen görünüm işlevini çağırır. içinde login(), kullanıcının oturum açma işlemi sırasında onay vermesi gereken kapsamların listesiyle işlevini çağırırsınız auth.log_in . Ayrıca parametrelerinde de sağlarsınız redirect_uri ; bu, uygulamanın yeniden yönlendirme URI'sine (Microsoft Azure yönetim merkezi) uygun olmalıdır.

İsteğe bağlı olarak, etkin oturumları olan hesaplar arasında yeniden kimlik doğrulaması, kullanıcı onayı veya hesap seçimi isteyerek oturum açma isteminin davranışını denetleyen gibi promptparametreler ekleyebilirsiniz.

Yetkilendirme akışının ikinci ayağında, kimlik doğrulama yanıtını auth.complete_log_in aşağıdaki gibi redirect_uri denetleyicisinin içindeki işlevi çağırarak işlersiniz:

@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"))

complete_log_in() işlevi, gelen auth_response sözlüğü sorgu parametreleri olarak alır. Başarılı olursa, işlevi kullanıcıyı kullanarak redirect(url_for("index"))"dizin" yoluna yönlendirir. Bu, kullanıcının bilgilerini başarıyla oturum açtığı ve zaten doğrulanmış bir kimlik belirtecinden talepler içeren bir sözlük olarak kullanılabildiği anlamına gelir.

Sonuç, koşulu if "error" in result:tarafından belirlenen bir hata içeriyorsa, şablonu kullanıcıya işleyin "auth_error.html" .

Kullanıcıları oturumu kapatma

Flask uygulamanızdaki kullanıcıların oturumunu kapatmak için yöntemini aşağıdaki gibi çağırın auth.log_out() :

@app.route("/logout")
def logout():
    return redirect(auth.log_out(url_for("index", _external=True)))

Kullanıcı uygulamadaki /logout URL yoluna gittiği zaman Flask, geçerli uygulamanın oturumunu kapatan oturumu kapatma işlevini çağırır. Ayrıca kullanıcıların oturumu kapatıldıktan sonra yönlendirileceği sayfayı da belirtirsiniz. Kod parçacığında, kullanarak kullanıcıları uygulamanın giriş sayfasına yönlendiriyoruz url_for("index", _external=True).

Web uygulaması için giriş noktası tanımlama

Oturum açma ve oturumu kapatma mantığını uyguladıktan sonra, işlevi aşağıdaki gibi oluşturarak uygulamanızın index() giriş sayfasına bir giriş noktası ekleyin:

@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__)

kullanıcı index() uygulamanın kök URL'sine("/") gittiği zaman işlev çağrılır. Uygulamanın giriş sayfasını işlemeden önce yapılandırma denetimlerini işler ve kullanıcı kimlik doğrulamasını doğrular. Yapılandırmada istemci kimliğinin ve istemci gizli dizisinin eksik olup olmadığını denetler ve değerlerden biri veya her ikisi de eksikse Flask şablonu işler "config_error.html" .

İşlev ayrıca kullanıcının kimliğinin doğrulanıp doğrulanmadığını doğrulamak için çağrı auth.get_user() yapar. Kullanıcının kimliği doğrulanmamışsa, kullanıcıyı "login" yola yönlendirir. Kimlik doğrulaması yapılırsa Flask "index.html" şablonunu işler ve işleme için kullanıcı nesnesini (öğesinden auth.get_user()alınır) geçirir.

Sonraki adımlar