Obtener tokens de Microsoft Entra ID para los usuarios mediante MSAL
Importante
En este artículo se describe cómo crear manualmente tokens de Microsoft Entra ID mediante la Biblioteca de autenticación de Microsoft (MSAL).
Databricks no recomienda que cree tokens de Microsoft Entra ID para usuarios de Azure Databricks manualmente. Esto se debe a que cada token de Microsoft Entra ID es de corta duración y, por lo general, caduca en una hora. Después de este tiempo, debe generar manualmente un token de reemplazo de Microsoft Entra ID. En su lugar, usa una de las herramientas participantes o SDK que implementan el estándar de la autenticación unificada del cliente de Databricks. Estas herramientas y SDK generan y reemplazan automáticamente los tokens de Microsoft Entra ID caducados, y sacan provecho de la autenticación de la CLI de Azure.
Las entidades de servicio administradas de Azure Databricks se administran directamente en Azure Databricks. Las entidades de servicio administradas de Microsoft Entra ID se administran en Microsoft Entra ID, lo que requiere permisos adicionales. Databricks recomienda usar entidades de servicio administradas de Azure Databricks para la mayoría de los casos de uso. Sin embargo, Databricks recomienda usar entidades de servicio administradas de Microsoft Entra ID en aquellos casos en los que deba autenticarse con Azure Databricks y otros recursos de Azure al mismo tiempo.
Para crear una entidad de servicio administrada de Azure Databricks en lugar de una entidad de servicio administrada de Microsoft Entra ID, consulte Administración de entidades de servicio.
Puede usar la Biblioteca de autenticación de Microsoft (MSAL) para adquirir tokens de acceso de Microsoft Entra ID mediante programación. En este artículo se describe el uso básico de la biblioteca MSAL y las entradas de usuario que se requieren, con ejemplos de Python.
Nota:
MSAL reemplaza a la Biblioteca de autenticación de Microsoft Entra ID (ADAL). Todo el soporte técnico y desarrollo de Microsoft para ADAL, incluidas las correcciones de seguridad, finalizaron el 30 de junio de 2022. Consulte Migración de aplicaciones a la Biblioteca de autenticación de Microsoft (MSAL).
Sugerencia
Es posible que quiera intentar usar la CLI de Azure en lugar de MSAL para obtener tokens de Microsoft Entra ID para los usuarios, ya que el uso de la CLI de Azure implica tener que realizar menos pasos. Consulte Obtención de tokens de Microsoft Entra ID para usuarios mediante la CLI de Azure.
También puede definir una entidad de servicio en Microsoft Entra ID y obtener un token de acceso de Microsoft Entra ID para la entidad de servicio, en lugar de para un usuario. Consulte Obtener tokens de Microsoft Entra ID para las entidades de servicio.
Configuración de una aplicación en Azure Portal
Registre una aplicación con el punto de conexión de Microsoft Entra ID en Azure Portal. Como alternativa, puede usar una aplicación de Microsoft Entra ID que ya esté registrada. Para obtener más información, consulte Registro de una aplicación mediante Azure Portal.
Inicie sesión en Azure Portal.
Nota:
El portal que se debe usar varía en función de si la aplicación Microsoft Entra ID se ejecuta en la nube pública de Azure o en una nube soberana o nacional. Para obtener más información, consulte Nubes nacionales.
Si tiene acceso a varios inquilinos, suscripciones o directorios, haga clic en el icono Directorios y suscripciones (directorio con filtro) del menú superior para cambiar al directorio en el que quiere registrar la aplicación.
Busque y seleccione Microsoft Entra ID.
En Administrar, seleccione Registros de aplicaciones > Nuevo registro.
En Nombre, escriba un nombre de la aplicación.
En la sección Tipos de cuenta admitidos, seleccione Accounts in this organizational directory only (Single tenant) (Solo las cuentas de este directorio organizativo [inquilino único]).
En la sección URI de redirección (opcional), en Seleccionar una plataforma, seleccione Cliente público/nativo (móvil y escritorio) y escriba un URI de redirección. En el ejemplo siguiente, el valor del URI de redirección es
http://localhost
.Haga clic en Registrar.
En la página Información general de la página de la aplicación, en la sección Essentials, copie los valores siguientes:
- Id. de la aplicación (cliente)
- Id. de directorio (inquilino)
- En URI de redirección, indique el URI de redirección del cliente público que escribió anteriormente en este procedimiento.
Agregue AzureDatabricks a los permisos necesarios de la aplicación registrada. Para realizar este paso, debe ser un usuario administrador. Si encuentra algún problema relacionado con los permisos mientras realiza esta acción, póngase en contacto con el administrador para obtener ayuda.
En la página Información general de la aplicación, en la pestaña Introducción, haga clic en Ver permisos de API.
Haga clic en Agregar un permiso.
En el panel Solicitud de permisos de API, haga clic en la pestaña API usadas en mi organización, busque AzureDatabricks y selecciónela.
Seleccione la casilla user_impersonation y, a continuación, haga clic en Agregar permisos.
Haga clic en Conceder consentimiento de administrador para ### y, después, en Sí. Para realizar esta acción, debe ser un usuario administrador o tener el privilegio de conceder consentimiento a la aplicación. Si no aparece Conceder consentimiento de administrador para ### o bien omite esta acción, debe usar el Flujo de código de autorización (interactivo) la primera vez que use la aplicación para proporcionar consentimiento. Después, puede usar el método Flujo de nombre de usuario y contraseña (programación).
Puede agregar usuarios adicionales a la aplicación. Para obtener más información, consulte Asignación de una cuenta de usuario a una aplicación empresarial para obtener instrucciones de Azure Portal o Asignación de usuarios y grupos a una aplicación en Microsoft Entra ID (anteriormente Azure Active Directory) para obtener instrucciones de PowerShell. Un usuario no podrá obtener un token sin los permisos necesarios.
Obtener un token de acceso de Microsoft Entra ID
Para obtener un token de acceso de Microsoft Entra ID, puede usar cualquiera de los siguientes elementos:
- Flujo de código de autorización (interactivo)
- Flujo de nombre de usuario y contraseña (programación)
Debe usar el flujo de código de autorización (interactivo) para obtener el token de acceso de Microsoft Entra ID si:
- La autenticación en dos fases está habilitada en Microsoft Entra ID.
- La autenticación federada está habilitada en Microsoft Entra ID.
- No se le concede el consentimiento a la aplicación registrada durante el registro de la aplicación.
Si tiene autoridad para iniciar sesión con un nombre de usuario y una contraseña, puede usar el flujo de nombre de usuario y contraseña (mediante programación) para obtener un token de acceso de Microsoft Entra ID.
Flujo de código de autorización (interactivo)
Existen dos pasos para adquirir un token de acceso de Microsoft Entra ID mediante el flujo de código de autorización.
- Solicite un código de autorización, lo que inicia una ventana del explorador y requiere el inicio de sesión del usuario de Azure. El código de autorización se devuelve una vez que el usuario inicie sesión correctamente.
- Use el código de autorización para adquirir el token de acceso de Microsoft Entra ID. Según el enfoque que use, puede que también se devuelva un token de actualización al mismo tiempo, que puede utilizarse para actualizar el token de acceso de Microsoft Entra ID.
Un enfoque para completar estos dos pasos es usar el explorador web y curl. Para ello, use el explorador web para obtener el código de autorización y, a continuación, use el código de autorización y curl
para obtener el token de acceso de Microsoft Entra ID. Este enfoque no proporciona ningún token de actualización.
Otro enfoque consiste en usar la biblioteca MSAL de Python. Para ello, ejecute un único script que use el explorador web para obtener el código de autorización y que, después, use el código de autorización para obtener tanto un token de acceso como uno de actualización.
Ambos enfoques suponen que ya ha iniciado sesión en Azure. Si no ha iniciado sesión, el explorador web le pedirá que lo haga.
Obtención de tokens de Microsoft Entra ID mediante un explorador web y curl
Recopile la información siguiente:
Parámetro Descripción Id. de inquilino El Id. de directorio (inquilino) de la aplicación registrada en Microsoft Entra ID en Configurar una app en Azure Portal. Id de cliente El Id. de aplicación (cliente) para la aplicación relacionada registrada en Microsoft Entra ID. URI de redireccionamiento Los URI de redirección adecuados para la aplicación relacionada registrada en Microsoft Entra ID (por ejemplo, http://localhost
). Las respuestas de autenticación se envían a este URI con el código de autorización incluido.Use el explorador web para desplazarse a la dirección URL que se indica más abajo y obtener el código de autorización. Reemplace los campos de la dirección URL de ejemplo siguiente según corresponda. Tenga en cuenta que la dirección URL debe enviarse como una sola línea; se han agregado saltos de línea a la dirección URL siguiente para facilitar su lectura. Para más información, consulte Solicitud de un código de autorización.
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?client_id=<client-id> &response_type=code &redirect_uri=<redirect-uri> &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=<state>
Sustituya:
<tenant-id>
por el id. de inquilino de la aplicación registrada.<client-id>
por el id. de cliente de la aplicación registrada.<redirect-uri>
por el URI de redirección de la aplicación registrada. Este URI debe estar en formato con codificación URL (codificado por porcentaje). Por ejemplo,http://localhost
eshttp%3A%2F%2Flocalhost
.<state>
por un número aleatorio o información codificada. Para ayudar a comprobar la integridad del intercambio de información, este valor de estado debe coincidir con el que se encuentra en la dirección URL que se devuelve más adelante, en este procedimiento.
No cambie el valor del parámetro
scope
. Representa el id. de programación para Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) junto con el ámbito predeterminado (/.default
, con codificación URL como%2f.default
).Por ejemplo:
https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/authorize?client_id=12a34b56-789c-0d12-e3fa-b456789c0123 &response_type=code &redirect_uri=http%3A%2F%2Flocalhost &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=12345
Pegue la dirección URL como una sola línea en el explorador web y, si se le solicita, inicie sesión en Azure.
El código de autorización está en el campo
code
de la dirección URL que se devuelve. Guarde el código de autorización en una ubicación segura. Además, asegúrese de que el valor del campostate
coincide con el que proporcionó anteriormente en este procedimiento.La dirección URL completa que se devuelve tendrá un aspecto similar al siguiente (con el valor de campo
code
completo reducido aquí a0.ASkAIj...RxgFhSAA
para abreviar):http://localhost/?code=0.ASkAIj...RxgFhSAA&state=12345&session_state=c44574d5-38ba-4f93-b2a3-a830db8e8cdf
Use el código de autorización junto con
curl
para obtener el token de acceso de Microsoft Entra ID.curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \ -d 'client_id=<client-id>' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=<authorization-code>' \ -d 'redirect_uri=<redirect-uri>' \ -d 'grant_type=authorization_code' \ -d 'state=<state>'
Sustituya:
<tenant-id>
por el id. de inquilino de la aplicación registrada.<client-id>
por el id. de cliente de la aplicación registrada.<authorization-code>
por el código de autorización.<redirect-uri>
por el URI de redirección de la aplicación registrada. Este URI debe estar en formato con codificación URL (codificado por porcentaje). Por ejemplo,http://localhost
eshttp%3A%2F%2Flocalhost
.<state>
por un número aleatorio o información codificada. Para ayudar a comprobar la integridad del intercambio de información, este valor de estado debe coincidir con el que se encuentra en la carga de respuesta más adelante, en este procedimiento.
No cambie el valor del parámetro
scope
. Representa el id. de programación para Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) junto con el ámbito predeterminado (/.default
, con codificación URL como%2f.default
).Por ejemplo:
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/token \ -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=0.ASkAIj...RxgFhSAA' \ -d 'redirect_uri=http%3A%2F%2Flocalhost' \ -d 'grant_type=authorization_code' \ -d 'state=12345'
El token de Microsoft Entra ID está en el valor
access_token
, en el resultado de la llamada. Asegúrese de comprobar que el valorstate
coincide con el que proporcionó anteriormente en este procedimiento.
Obtención de tokens de Microsoft Entra ID mediante la biblioteca MSAL de Python
Recopile la información siguiente:
Parámetro Descripción Id. de inquilino El Id. de directorio (inquilino) de la aplicación registrada en Microsoft Entra ID en Configurar una app en Azure Portal. Id de cliente El Id. de aplicación (cliente) para la aplicación relacionada registrada en Microsoft Entra ID. En este procedimiento se asume que ha establecido
http://localhost
como URI de redirección para la aplicación registrada en Microsoft Entra ID.Instale el SDK de MSAL de Python en la máquina local mediante la ejecución de
pip install msal
.Guarde el código siguiente como
get-tokens.py
en la máquina local.# Given the client ID and tenant ID for an app registered in Azure, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scopes = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 3): print("Usage: get-tokens.py <client ID> <tenant ID>") exit(1) # If the registered app's client ID and tenant ID are provided as # command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_interactive( scopes = scopes ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Realice una de las siguientes acciones:
- En el código anterior, reemplace
<client-id>
por el identificador de cliente de la aplicación registrada y<tenant-id>
por el identificador de inquilino de la aplicación registrada y, a continuación, ejecute el script, por ejemplopython get-tokens.py
. - Proporcione el identificador de cliente de la aplicación registrada y el identificador de inquilino de la aplicación registrada al ejecutar el script, por ejemplo
python get-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de
.
- En el código anterior, reemplace
Si el explorador web se lo pide, inicie sesión en Azure.
Los tokens de acceso y actualización de Microsoft Entra ID se imprimen en la salida.
Flujo de nombre de usuario y contraseña (programación)
Si tiene autoridad para iniciar sesión con un nombre de usuario y una contraseña, recopile la información siguiente:
Parámetro Descripción Id. de inquilino El Id. de directorio (inquilino) de la aplicación registrada en Microsoft Entra ID en Configurar una app en Azure Portal. Id de cliente El Id. de aplicación (cliente) para la aplicación relacionada registrada en Microsoft Entra ID. Nombre de usuario y contraseña El nombre de usuario (es decir, la dirección de correo electrónico al iniciar sesión en Azure Portal) y la contraseña del usuario en el inquilino. En este procedimiento se asume que ha establecido
http://localhost
como URI de redirección para la aplicación registrada en Microsoft Entra ID.Instale el SDK de MSAL de Python en la máquina local mediante la ejecución de
pip install msal
.Guarde el código siguiente como
get-tokens-for-user.py
en la máquina local.# Given the client ID and tenant ID for an app registered in Azure, # along with an Azure username and password, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # along with the Azure username and password, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' username = '<username>' password = '<password>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 5): print("Usage: get-tokens-for-user.py <client ID> <tenant ID> <username> <password>") exit(1) # If the registered app's client ID and tenant ID along with the # Azure username and password are provided as command-line variables, # set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] username = sys.argv[3] password = sys.argv[4] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_username_password( username = username, password = password, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Realice una de las siguientes acciones:
- En el código anterior, reemplace
<client-id>
por el identificador de cliente de la aplicación registrada,<tenant-id>
por el identificador de inquilino de la aplicación registrada,<username>
por el nombre de usuario y<password>
por la contraseña y, a continuación, ejecute el script, por ejemplopython get-tokens-for-user.py
. - Proporcione el identificador de cliente de la aplicación registrada, el identificador de inquilino de la aplicación registrada, el nombre de usuario y la contraseña al ejecutar el script, por ejemplo
python get-tokens-for-user.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de someone@example.com "MyPa55w&rd!"
. Si un argumento de línea de comandos contiene caracteres especiales, debe incluirlo entre comillas.
- En el código anterior, reemplace
Los tokens de acceso y actualización de Microsoft Entra ID se imprimen en su terminal.
Uso de un token de acceso de Microsoft Entra ID para acceder a la API de REST de Databricks
En esta sección se describe cómo usar un token de acceso de Microsoft Entra ID para llamar a la API de REST de Databricks. En los ejemplos siguientes, reemplace <access-token>
por el token de acceso de Microsoft Entra ID y <databricks-instance>
por la dirección URL por área de trabajo de la implementación de Azure Databricks.
Ejemplo de Python
En este ejemplo se muestra cómo enumerar los clústeres en un área de trabajo de Azure Databricks.
import requests
import json
databricks_instance = '<databricks-instance>'
api_version = '/api/2.0'
api_command = '/clusters/list'
url = f"https://{databricks_instance}{api_version}{api_command}"
access_token = '<access-token>'
response = requests.get(
url = url,
headers = { 'Authorization': "Bearer " + access_token}
)
print(json.dumps(json.loads(response.text), indent = 2))
Nota:
Si quiere iniciar sesión como usuario administrador pero no lo es, debe proporcionar el encabezado X-Databricks-Azure-Workspace-Resource-Id
, además del encabezado 'Authorization' : 'Bearer '
, así como tener el rol de Colaborador o Propietario en el recurso del área de trabajo de Azure. El valor X-Databricks-Azure-Workspace-Resource-Id
se construye de la siguiente forma:
# ...
subscription = '<azure-subscription-id>'
resource_group = '<azure-resource-group-name>'
workspace = '<databricks-workspace-name-in-azure>'
db_resource_id = '/subscriptions/%s/resourcegroups/%s/providers/microsoft.databricks/workspaces/%s' % (
subscription,
resource_group,
workspace
)
# ...
headers = {
'Authorization': "Bearer " + access_token,
'X-Databricks-Azure-Workspace-Resource-Id': db_resource_id
}
# ...
Para obtener información de la suscripción, el recurso y el área de trabajo en Azure, consulte Apertura de recursos. Para abrir el recurso de destino, puede buscar en el tipo de servicio Azure Databricks y en cualquier otra información de Azure que conozca sobre el área de trabajo de Azure Databricks de destino.
Ejemplo de curl
curl -X GET \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Refrescar un token de acceso de Microsoft Entra ID
Si obtiene un token de actualización junto con el token de acceso de Microsoft Entra ID, puede usar el token de actualización para obtener un nuevo token. De forma predeterminada, la vigencia de los tokens de acceso de Microsoft Entra ID es un período de tiempo aleatorio entre 60 y 90 minutos (una media de 75 minutos). Puede configurar la duración de los tokens de acceso de Microsoft Entra ID mediante los métodos de Duración de tokens configurables en Microsoft Entra ID (anteriormente Azure Active Directory).
En el ejemplo siguiente se muestra cómo usar la biblioteca MSAL de Python junto con un token de actualización para obtener un nuevo token.
Guarde el código siguiente como
refresh-tokens.py
en la máquina local.# Given the client ID and tenant ID for an app registered in Azure, # along with a refresh token, provide a new <ms-entra-id> access token and # refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID, tenant ID, # and refresh token here, or you can provide them as command-line # arguments to this script. client_id = '<client-id>' tenant_id = '<refresh-token' refresh_token = '<refresh-token>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 4): print("Usage: refresh-tokens.py <client ID> <tenant ID> <refresh token>") exit(1) # If the registered app's client ID, tenant ID, and refresh token are # provided as command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] refresh_token = sys.argv[3] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_refresh_token( refresh_token = refresh_token, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("\nNew access token:\n") print(acquire_tokens_result['access_token']) print("\nNew refresh token:\n") print(acquire_tokens_result['refresh_token'])
Realice una de las siguientes acciones:
- En el código anterior, reemplace
<client-id>
por el identificador de cliente de la aplicación registrada,<tenant-id>
por el identificador de inquilino de la aplicación registrada y<refresh-token>
por el token de actualización y, a continuación, ejecute el script, por ejemplopython get-tokens-for-user.py
. - Proporcione el identificador de cliente de la aplicación registrada, el identificador de inquilino de la aplicación registrada y el token de actualización al ejecutar el script, por ejemplo
python refresh-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de "0.ASkAIj...huE84ALg"
. Si un argumento de línea de comandos contiene caracteres especiales, debe incluirlo entre comillas.
- En el código anterior, reemplace
Los nuevo tokens de acceso y actualización de Microsoft Entra ID se imprimen en su terminal.