Mengaktifkan SSO di Linux asli menggunakan Python MSAL

Pustaka Autentikasi Microsoft (MSAL) adalah Software Development Kit (SDK) yang memungkinkan aplikasi memanggil broker Single Sign-On Microsoft ke Linux, komponen Linux yang didistribusikan secara independen dari distribusi Linux, namun diinstal melalui manajer paket dengan sudo apt install microsoft-identity-broker atau sudo dnf install microsoft-identity-broker.

Komponen ini bertindak sebagai broker autentikasi, yang memungkinkan pengguna aplikasi Anda memanfaatkan integrasi dengan akun yang dikenali oleh Linux—seperti akun yang Anda gunakan untuk masuk ke sesi Linux untuk aplikasi yang menggunakan broker ini.

Broker tersebut juga dibundel sebagai dependensi untuk aplikasi yang dikembangkan oleh Microsoft (seperti Company Portal)). Contoh penginstalan broker yang diinstal adalah ketika komputer Linux terdaftar ke armada perangkat perusahaan melalui solusi manajemen titik akhir seperti Microsoft Intune.

Apa itu broker

Broker autentikasi adalah aplikasi yang berjalan pada komputer pengguna yang mengelola jabat tangan autentikasi dan pemeliharaan token untuk akun yang terhubung. Sistem operasi Linux menggunakan Microsoft single sign-on for Linux sebagai perantara autentikasi. Ini memiliki banyak manfaat bagi pengembang dan pelanggan, termasuk:

  • Mengaktifkan Masuk Sekali: memungkinkan aplikasi menyederhanakan cara pengguna mengautentikasi dengan Microsoft Entra ID dan melindungi token penyegaran Microsoft Entra ID dari eksfiltrasi dan penyalahgunaan
  • Keamanan yang ditingkatkan. Banyak peningkatan keamanan disertakan bersama broker, tanpa perlu memperbarui logika aplikasi.
  • Dukungan fitur. Dengan bantuan broker, pengembang dapat mengakses beragam kemampuan OS dan layanan.
  • Integrasi sistem. Aplikasi yang menggunakan broker plug-and-play dengan pemilih akun bawaan, memungkinkan pengguna untuk dengan cepat memilih akun yang ada alih-alih memasukkan kembali kredensial yang sama berulang-ulang.
  • Perlindungan Token. Single sign-on Microsoft untuk Linux memastikan bahwa token penyegaran terikat ke perangkat.

Bagaimana cara memilih menggunakan broker?

  1. Dalam pustaka MSAL Python, kami telah memperkenalkan flag enable_broker_on_linux, yang mengaktifkan broker baik di WSL maupun Linux mandiri.
    • Jika tujuan Anda adalah mengaktifkan dukungan broker hanya pada WSL untuk Azure CLI, Anda dapat mempertimbangkan untuk memodifikasi kode aplikasi Azure CLI guna mengaktifkan flag enable_broker_on_wsl khusus di WSL.
    • Jika Anda menulis aplikasi lintas platform, Anda juga perlu menggunakan enable_broker_on_windows, seperti yang diuraikan dalam artikel Menggunakan Python MSAL dengan Pengelola Akun Web.
    • Anda dapat mengatur kombinasi parameter keikutsertaan berikut ke true:
Penanda persetujuan Jika aplikasi akan berjalan Aplikasi telah mendaftarkan ini sebagai URI pengalihan platform Desktop di portal Azure
enable_broker_on_windows Windows 10+ ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
enable_broker_on_wsl WSL ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
enable_broker_on_mac Mac dengan Company Portal terinstal msauth.com.msauth.unsignedapp://auth
mengaktifkan_broker_di_linux Linux dengan Intune terinstal https://login.microsoftonline.com/common/oauth2/nativeclient (HARUS diaktifkan)
  1. Aplikasi Anda perlu mendukung URI pengalihan khusus broker. Untuk Linux khususnya, URL untuk URI pengalihan harus:

    https://login.microsoftonline.com/common/oauth2/nativeclient
    
  2. Untuk menggunakan broker, Anda harus menginstal paket terkait broker selain MSAL inti dari PyPI:

    pip install "msal[broker]>=1.33.0b1,<2"
    
  3. Setelah dikonfigurasi, Anda dapat memanggil acquire_token_interactive untuk memperoleh token.

    result = app.acquire_token_interactive(["User.ReadBasic.All"],
                        parent_window_handle=app.CONSOLE_WINDOW_HANDLE)
    

Parameter untuk dukungan broker

Parameter berikut tersedia untuk mengonfigurasi dukungan broker di Python MSAL. Parameter ini dapat diteruskan ke PublicClientApplication konstruktor atau ke acquire_token_interactive metode .

Parameters: Type Deskripsi
enable_broker_on_windows boolean Pengaturan ini hanya efektif jika aplikasi Anda berjalan di Windows 10+. Parameter ini default ke Tidak Ada, yang berarti MSAL tidak akan menggunakan broker.

New in MSAL Python 1.25.0.
enable_broker_on_wsl boolean Pengaturan ini hanya efektif jika aplikasi Anda berjalan di WSL. Parameter ini default ke Tidak Ada, yang berarti MSAL tidak akan menggunakan broker.

New in MSAL Python 1.25.0.
enable_broker_on_mac boolean Pengaturan ini hanya efektif jika aplikasi Anda berjalan di Mac dengan Company Portal terinstal. Parameter ini default ke Tidak Ada, yang berarti MSAL tidak akan menggunakan broker.

New in MSAL Python 1.31.0.
mengaktifkan_broker_di_linux boolean Pengaturan ini hanya efektif jika aplikasi Anda berjalan di Linux dengan Intune terinstal. Parameter ini default ke Tidak Ada, yang berarti MSAL tidak akan menggunakan broker.

New in MSAL Python 1.33.0.
parent_window_handle int OPSIONAL

Catatan mengenai parent_window_handle

Parameter parent_window_handle diperlukan meskipun di Linux tidak digunakan. Untuk aplikasi GUI, lokasi permintaan masuk akan ditentukan ad-hoc dan saat ini tidak dapat terikat ke jendela tertentu. Dalam pembaruan mendatang, parameter ini akan digunakan untuk menentukan jendela induk yang sebenarnya .

Condition Deskripsi
Aplikasi tidak ingin menggunakan broker tidak perlu menentukan parent_window_handle
Aplikasi memilih untuk menggunakan broker parent_window_handle wajib diisi
Aplikasi adalah aplikasi GUI yang berjalan di sistem Windows atau Mac perlu memberikan handle jendelanya agar jendela masuk muncul di atas jendela Anda
Aplikasi adalah aplikasi konsol yang berjalan di sistem Windows atau Mac dapat menggunakan placeholder PublicClientApplication.CONSOLE_WINDOW_HANDLE
Aplikasi dimaksudkan untuk menjadi aplikasi lintas platform Aplikasi perlu menggunakan enable_broker_on_windows, seperti yang diuraikan dalam artikel Menggunakan Python MSAL dengan Pengelola Akun Web.

Perilaku fallback pada dukungan broker di MSAL Python

MSAL akan mengalami kesalahan, atau mundur secara diam-diam ke alur non-broker.

  1. MSAL akan mengabaikan enable_broker_... dan melewati broker pada alur autentikasi yang diketahui TIDAK didukung oleh broker. Ini termasuk ADFS, B2C, dll.. Untuk skenario "could-use-broker" lainnya, silakan lihat di bawah.

  2. MSAL mengalami error saat pengembang aplikasi memilih menggunakan broker, tetapi paket "mid-tier" yang menjadi dependensi langsung tidak diinstal. Pesan kesalahan mengarahkan pengembang aplikasi untuk mendeklarasikan dependensi yang tepat, yaitu msal[broker]. Kami menampilkan error di sini karena error tersebut dapat ditindaklanjuti oleh pengembang aplikasi.

  3. MSAL secara diam-diam "menonaktifkan" broker dan beralih kembali ke mode non-broker saat opsi ini dipilih, dependensi telah diinstal, tetapi gagal diinisialisasi. Kami mengantisipasi hal ini akan terjadi pada perangkat yang OS-nya terlalu tua atau komponen broker yang mendasar entah bagaimana tidak tersedia. Tidak banyak pengembang aplikasi atau pengguna akhir yang dapat melakukannya di sini. Pada akhirnya, kebijakan akses bersyarat akan memaksa pengguna untuk beralih ke perangkat lain.

  4. MSAL mengalami error saat broker diaktifkan, diinstal, dan diinisialisasi, tetapi permintaan token berikutnya gagal.

Important

Jika paket terkait broker tidak diinstal dan Anda akan mencoba menggunakan broker autentikasi, Anda akan mendapatkan kesalahan: ImportError: You need to install dependency by: pip install "msal[broker]>=1.xx,<2".

Note

Parameter parent_window_handle diperlukan meskipun di Linux tidak digunakan. Untuk aplikasi GUI, lokasi permintaan masuk akan ditentukan ad-hoc dan saat ini tidak dapat terikat ke jendela tertentu. Dalam pembaruan mendatang, parameter ini akan digunakan untuk menentukan jendela induk yang sebenarnya .

Penyimpanan sementara token

Broker autentikasi menangani refresh dan penembolokan token akses. Anda tidak perlu mengatur cache kustom.

Membuat aplikasi contoh

Anda dapat menemukan aplikasi sampel yang menunjukkan cara menggunakan Python MSAL dengan broker autentikasi di Linux di repositori Python GitHub MSAL. Aplikasi sampel terletak di samples/console_app direktori dan menyertakan contoh cara menggunakan broker untuk autentikasi.

Pendaftaran Aplikasi

Perbarui pendaftaran Aplikasi Anda di portal Azure untuk menyertakan URI pengalihan khusus broker untuk Linux:

https://login.microsoftonline.com/common/oauth2/nativeclient

Ketergantungan Linux

Pertama, periksa apakah Anda telah menginstal python3 pada distribusi Linux Anda.

python3 --version

Jika tidak, instal menggunakan manajer paket untuk distribusi Anda.

Untuk menginstal pada distribusi Linux berbasis debian/Ubuntu:

sudo add-apt-repository -y universe
sudo apt update
sudo apt install python3 python3-pip libwebkit2gtk-4.1-dev -y

Dependensi Python

Untuk menggunakan broker, Anda harus menginstal paket terkait broker selain MSAL inti dari PyPI:

pip install "msal[broker]>=1.33.0b1,<2"

Buat Project

Setelah dikonfigurasi, Anda dapat memanggil acquire_token_interactive untuk memperoleh token.

import sys  # For simplicity, we'll read config file from 1st CLI param sys.argv[1]
import json
import logging
import requests
import msal

# Optional logging
# logging.basicConfig(level=logging.DEBUG)

var_authority = "https://login.microsoftonline.com/common"
var_client_id = "your-client-id-here"  # Replace with your app's client ID
var_username = "your-username-here"  # Replace with your username, e.g., "
var_scope = ["User.ReadBasic.All"]
# Removed unused variable to avoid confusion


# Create a preferably long-lived app instance which maintains a token cache (Default cache is in memory only).
app = msal.PublicClientApplication(
    var_client_id, 
    authority=var_authority,
    enable_broker_on_windows=True,
    enable_broker_on_wsl=True
    )

# The pattern to acquire a token looks like this.
result = None

# Firstly, check the cache to see if this end user has signed in before
accounts = app.get_accounts(username=var_username)
if accounts:
    logging.info("Account(s) exists in cache, probably with token too. Let's try.")
    result = app.acquire_token_silent(var_scope, account=accounts[0])

if not result:
    logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
    
    result = app.acquire_token_interactive(var_scope,parent_window_handle=app.CONSOLE_WINDOW_HANDLE)
    
if "access_token" in result:
    print("Access token is: %s" % result['access_token'])

else:
    print(result.get("error"))
    print(result.get("error_description"))
    print(result.get("correlation_id"))  # You may need this when reporting a bug
    if 65001 in result.get("error_codes", []):  # Not mean to be coded programatically, but...
        # AAD requires user consent for U/P flow
        print("Visit this to consent:", app.get_authorization_request_url(config["scope"]))