Habilitar el SSO en Linux nativo con MSAL para Python

Biblioteca de autenticación de Microsoft (MSAL) es un kit de desarrollo de software (SDK) que permite a las aplicaciones llamar al intermediario de inicio de sesión único de Microsoft para Linux, un componente de Linux que se distribuye de forma independiente de la distribución de Linux; sin embargo, se instala mediante un gestor de paquetes con sudo apt install microsoft-identity-broker o sudo dnf install microsoft-identity-broker.

Este componente actúa como intermediario de autenticación, lo que permite a los usuarios de tu aplicación beneficiarse de la integración con cuentas reconocidas por Linux, como la cuenta con la que has iniciado sesión en tus sesiones de Linux para las aplicaciones que usan este intermediario.

El broker también se incluye como dependencia de las aplicaciones desarrolladas por Microsoft (como Portal de empresa). Un ejemplo de cuándo se instala el broker es cuando un equipo Linux se inscribe en la flota de dispositivos de una empresa mediante una solución de gestión de endpoints como Microsoft Intune.

¿Qué es un agente?

Un agente de autenticación es una aplicación que se ejecuta en la máquina de un usuario que administra los protocolos de enlace de autenticación y el mantenimiento de tokens para las cuentas conectadas. El sistema operativo Linux usa el inicio de sesión único de Microsoft para Linux como intermediario de autenticación. Tiene muchas ventajas para desarrolladores y clientes, entre las que se incluyen:

  • Permite el inicio de sesión único: permite a las aplicaciones simplificar la forma en que los usuarios se autentican con Microsoft Entra ID y protege los tokens de actualización de Microsoft Entra ID frente a la exfiltración y el uso indebido
  • Seguridad mejorada. Muchas mejoras de seguridad se incorporan en el broker, sin necesidad de actualizar la lógica de la aplicación.
  • Compatibilidad de funciones. Gracias al broker, los desarrolladores pueden acceder a amplias funcionalidades del sistema operativo y de los servicios.
  • Integración del sistema. Las aplicaciones que utilizan el broker «plug-and-play» con el selector de cuentas integrado permiten al usuario seleccionar rápidamente una cuenta existente en lugar de tener que volver a introducir las mismas credenciales una y otra vez.
  • Protección de tokens. El inicio de sesión único de Microsoft para Linux garantiza que los tokens de actualización estén vinculados al dispositivo.

¿Cómo activar el uso del broker?

  1. En la biblioteca MSAL Python, hemos introducido el indicador enable_broker_on_linux, que habilita el broker tanto en WSL como en Linux autónomo.
    • Si su objetivo es habilitar la compatibilidad con el agente intermediario únicamente en WSL en CLI de Azure, puede plantearse modificar el código de la aplicación de CLI de Azure para activar la marca enable_broker_on_wsl exclusivamente en WSL.
    • Si va a escribir una aplicación multiplataforma, también tendrá que usar enable_broker_on_windows, como se describe en el artículo Uso de MSAL Python con el Administrador de cuentas web.
    • Puede establecer cualquier combinación de los siguientes parámetros de inclusión voluntaria como true:
Indicador de suscripción Si la aplicación se ejecuta en La aplicación ha registrado esto como URI de redirección para la plataforma de escritorio en el Portal de Azure
enable_broker_on_windows Windows 10+ ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
habilitar broker en WSL WSL ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
habilitar_broker_en_mac Mac con Portal de empresa instalado msauth.com.msauth.unsignedapp://auth
enable_broker_on_linux Linux con Intune instalado https://login.microsoftonline.com/common/oauth2/nativeclient (DEBE estar habilitado)
  1. Su aplicación debe admitir URI de redirección específicas del broker. En Linux concreto, la dirección URL del URI de redirección debe ser:

    https://login.microsoftonline.com/common/oauth2/nativeclient
    
  2. Para usar el broker, deberá instalar los paquetes relacionados con el broker, además del paquete principal de MSAL disponible en PyPI:

    pip install "msal[broker]>=1.33.0b1,<2"
    
  3. Una vez configurado, puede llamar a acquire_token_interactive para obtener un token.

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

Parámetros para la compatibilidad con el intermediario

Los siguientes parámetros están disponibles para configurar la compatibilidad con el broker en MSAL Python. Estos parámetros se pueden pasar al PublicClientApplication constructor o al acquire_token_interactive método .

Parameters: Tipo Description
enable_broker_on_windows boolean Esta configuración solo es efectiva si la aplicación se ejecuta en Windows 10+. Este parámetro tiene como valor predeterminado None, lo que significa que MSAL no usará un agente.

New in MSAL Python 1.25.0.
enable_broker_on_wsl boolean Esta configuración solo es efectiva si la aplicación se ejecuta en WSL. Este parámetro tiene como valor predeterminado None, lo que significa que MSAL no usará un agente.

New in MSAL Python 1.25.0.
habilitar_broker_en_mac boolean Esta configuración solo es efectiva si la aplicación se ejecuta en Mac con Portal de empresa instalado. Este parámetro tiene como valor predeterminado None, lo que significa que MSAL no usará un agente.

New in MSAL Python 1.31.0.
enable_broker_on_linux boolean Esta configuración solo es efectiva si la aplicación se ejecuta en Linux con Intune instalado. Este parámetro tiene como valor predeterminado None, lo que significa que MSAL no usará un agente.

New in MSAL Python 1.33.0.
parent_window_handle int OPCIONAL

Notas sobre parent_window_handle

El parent_window_handle parámetro es necesario aunque en Linux no se use. Para las aplicaciones con interfaz gráfica, la ubicación de la ventana de inicio de sesión se determinará según el caso y actualmente no puede asociarse a una ventana específica. En una actualización futura, este parámetro se usará para determinar la ventana principal real .

Condition Description
La aplicación no quiere usar un agente no es necesario especificar un parent_window_handle
La aplicación opta por usar un agente parent_window_handle es obligatorio
La aplicación es una aplicación de GUI que se ejecuta en el sistema Windows o Mac. es necesario proporcionar el identificador de ventana, para que la ventana de inicio de sesión aparezca sobre tu ventana
La aplicación es una aplicación de consola que se ejecuta en el sistema Windows o Mac. puede usar un marcador de posición PublicClientApplication.CONSOLE_WINDOW_HANDLE
La aplicación está pensada para ser una aplicación multiplataforma La aplicación debe usar enable_broker_on_windows, como se describe en el artículo Uso de MSAL Python con el Administrador de cuentas web.

Los comportamientos alternativos del soporte de broker de MSAL Python

MSAL generará un error o recurrirá silenciosamente a flujos sin el broker.

  1. MSAL ignorará enable_broker_… y omitirá el broker en aquellos flujos de autenticación que se sabe que NO son compatibles con el broker. Esto incluye ADFS, B2C, etc. Para otros escenarios en los que «se podría utilizar el broker», consulta más abajo.

  2. MSAL genera un error cuando el desarrollador de la aplicación ha optado por usar el broker, pero no está instalado un paquete “mid-tier” de dependencia directa. El mensaje de error guía al desarrollador de aplicaciones para declarar la dependencia correcta msal[broker]. Aquí generamos un error porque es una acción que los desarrolladores de aplicaciones pueden resolver.

  3. MSAL «desactiva» silenciosamente el broker y recurre a un flujo sin broker cuando, tras haberlo activado, la dependencia se ha instalado pero no se ha podido inicializar. Se prevé que esto ocurriría en un dispositivo cuyo sistema operativo es demasiado antiguo o el componente de agente subyacente no está disponible de alguna manera. No hay mucho que un desarrollador de aplicaciones o el usuario final pueda hacer aquí. Finalmente, la directiva de acceso condicional obligará al usuario a cambiar a otro dispositivo.

  4. MSAL da error cuando el intermediario está habilitado, instalado e inicializado, pero las solicitudes posteriores de token fallan.

Importante

Si los paquetes relacionados con el agente no están instalados y intentará usar el agente de autenticación, obtendrá un error: ImportError: You need to install dependency by: pip install "msal[broker]>=1.xx,<2".

Note

El parent_window_handle parámetro es necesario aunque en Linux no se use. Para las aplicaciones con interfaz gráfica, la ubicación de la ventana de inicio de sesión se determinará según el caso y actualmente no puede asociarse a una ventana específica. En una actualización futura, este parámetro se usará para determinar la ventana principal real .

Almacenamiento en caché de tokens

El intermediario de autenticación se encarga del almacenamiento en caché de los tokens de actualización y de acceso. No es necesario configurar el almacenamiento en caché personalizado.

Creación de una aplicación de ejemplo

Puede encontrar una aplicación de ejemplo que muestre cómo usar MSAL Python con el agente de autenticación en Linux en el repositorio de Python GitHub de MSAL. La aplicación de ejemplo se encuentra en el directorio samples/console_app e incluye ejemplos de cómo utilizar el intermediario para la autenticación.

Registro de aplicaciones

Actualice el registro de la aplicación en el portal de Azure para que incluya el URI de redirección específico del intermediario para Linux:

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

Dependencias de Linux

En primer lugar, compruebe si tiene python3 instalado en la distribución de Linux.

python3 --version

Si no es así, instálelo mediante el administrador de paquetes para la distribución.

Para instalar en la distribución de Linux basada en Debian/Ubuntu:

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

Dependencias de Python

Para usar el broker, deberá instalar los paquetes relacionados con el broker, además del paquete principal de MSAL disponible en PyPI:

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

Proyecto Create

Una vez configurado, puede llamar a acquire_token_interactive para obtener un 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"]))