Compartir a través de


Obtención manual de tokens de identificación de Microsoft Entra

En esta página se describe cómo generar manualmente los tokens de acceso de Microsoft Entra ID para que los usuarios y los principales del servicio se autentiquen con las REST APIs de Azure Databricks. La generación manual de tokens es una técnica avanzada.

Importante

Databricks no recomienda crear manualmente tokens de identificador de Microsoft Entra. Expiran en un plazo de una hora y requieren reemplazo manual. En su lugar, use herramientas o SDK con autenticación unificada para controlar la administración de tokens automáticamente.

Use principales de servicio administrados de Azure Databricks para la mayor parte de los casos de uso. Use solo las entidades de servicio administradas de Microsoft Entra ID cuando necesite acceder a los recursos de Azure, ya que requieren permisos adicionales de Microsoft Entra ID.

Cuándo usar la generación manual de tokens

Use la generación manual de tokens solo cuando:

  • Debe integrarse con sistemas que no pueden usar la CLI de Azure ni la autenticación unificada.
  • Necesita un control explícito sobre el ciclo de vida y la renovación del token.
  • ** Usted está depurando problemas de autenticación

Para todos los demás casos de uso, use los métodos de autenticación recomendados que controlan la administración de tokens automáticamente.

Obtención de tokens para usuarios

Utiliza la CLI de Azure o la Biblioteca de autenticación de Microsoft (MSAL) para obtener tokens de acceso de identidad de Microsoft Entra para los usuarios.

Método de la CLI de Azure

  1. Obtenga el identificador de suscripción de Azure para la cuenta de usuario:

    • Desde el área de trabajo de Azure Databricks: Haga clic en el nombre de usuario > Informacióngeneral de > y busque el identificador de suscripción.

    • Con la CLI de Azure: Ejecute el siguiente comando (reemplace por la dirección URL del área de trabajo):

      az databricks workspace list --query "[?workspaceUrl==\`adb-0000000000000000.0.azuredatabricks.net\`].{id:id}" -o tsv
      
      # /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Databricks/workspaces/my-ws
      

      Después de 00000000-0000-0000-0000-000000000000, /subscriptions/ es tu identificador de suscripción.

      Si recibe un error de cliente, inicie sesión en el cliente correcto:

      az login -t <tenant-id>
      

      Consulte Obtener identificadores de suscripción e inquilino en el portal de Azure.

  2. Inicie sesión en Azure:

    az login
    
  3. Establezca la suscripción correcta:

    az account set -s <subscription-id>
    
  4. Genere el token de acceso:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

    El identificador 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d de recurso es el identificador estándar de Azure Databricks en todos los entornos de Azure.

Método MSAL

Utiliza la Biblioteca de autenticación de Microsoft (MSAL) para obtener tokens de acceso de Microsoft Entra ID mediante programación. MSAL admite dos flujos:

  • Flujo de código de autorización (interactivo): Inicia un explorador para el inicio de sesión del usuario. Úselo cuando se habilite la autenticación federada o en dos fases, o cuando se requiera el consentimiento del administrador.
  • Flujo de nombre de usuario y contraseña (mediante programación): Se autentica con un nombre de usuario y una contraseña. Úselo solo cuando tenga autoridad para iniciar sesión automáticamente.

Antes de usar MSAL, debe registrar una aplicación en microsoft Entra ID. Consulte Registro de una aplicación mediante Azure Portal. Al registrarse:

  1. Establezca Tipos de cuenta admitidos en cuentas en este directorio organizativo solamente (inquilino único).
  2. Establezca URI de redirección en Cliente público o nativo (móvil y escritorio) con el valor http://localhost.
  3. Anote el identificador de aplicación (cliente) y el identificador de directorio (inquilino) de la página Información general de la aplicación.
  4. Agregue el permiso de API de AzureDatabricks :
    1. Vaya a Permisos> de APIAgregar un permiso.
    2. Busque y seleccione AzureDatabricks.
    3. Habilite user_impersonation y haga clic en Agregar permisos.
    4. Haga clic en Conceder consentimiento del administrador (requiere privilegios de administrador).

Flujo del código de autorización

Instale el SDK de Python de MSAL:

pip install msal

Guarde el código siguiente como get-tokens.py:

from msal import PublicClientApplication
import sys

# Provide client ID and tenant ID as command-line arguments
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_interactive(scopes=scopes)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Ejecute el script:

python get-tokens.py <client-id> <tenant-id>

Flujo de nombre de usuario y contraseña

Guarde el código siguiente como get-tokens-user.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
username = sys.argv[3] if len(sys.argv) > 1 else '<username>'
password = sys.argv[4] if len(sys.argv) > 1 else '<password>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_username_password(
  username=username,
  password=password,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Ejecute el script:

python get-tokens-user.py <client-id> <tenant-id> <username> <password>

Obtención de tokens para entidades de servicio

Las entidades de servicio usan el flujo de credenciales de cliente de OAuth 2.0 y pueden tener un control de acceso diferente al de los usuarios normales.

Crear un principal de servicio

Si no tiene un servicio principal, créelo mediante el portal de Azure o la CLI de Azure.

Portal de Azure

  1. Inicie sesión en Azure Portal.
  2. Cambie al inquilino correcto mediante Directorios y suscripciones si es necesario.
  3. Busque y seleccione Microsoft Entra ID.
  4. Haga clic en + Agregar>registro de aplicaciones.
  5. Escriba un nombre y seleccione Cuentas solo en este directorio organizativo (inquilino único).
  6. Haga clic en Registrar.
  7. Copie estos valores en la página Información general :
    • Id. de la aplicación (cliente)
    • Id. de directorio (inquilino)
  8. Vaya a Certificados y secretos>Secretos de cliente>Nuevo secreto de cliente.
  9. Agregue una descripción, establezca un período de expiración y haga clic en Agregar.
  10. Copie y almacene de forma segura el valor del secreto de cliente.

CLI de Azure

Consulte Crear una entidad de servicio de Azure con la CLI de Azure para obtener instrucciones completas.

Generar un símbolo

Genere un token mediante la API REST o la CLI de Azure. Recopile primero la siguiente información:

  • Id. de inquilino: Identificador de directorio (inquilino) de Microsoft Entra ID
  • Id. de cliente: Identificador de aplicación (cliente) de Microsoft Entra ID
  • Secreto de cliente: El valor del secreto de cliente de Microsoft Entra ID

Método de LA API REST

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 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d 'client_secret=<client-secret>'

El token de acceso está en el access_token campo de la respuesta.

Método de la CLI de Azure

  1. Obtenga el identificador de suscripción de Azure. Consulte Obtención de tokens para usuarios.

  2. Inicie sesión con el principal de servicio:

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. Establezca la suscripción correcta:

    az account set -s <subscription-id>
    
  4. Genere el token de acceso:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

Uso de tokens con las API de Databricks

Después de generar un token, úselo con la API REST de Databricks.

Principales de servicio en el entorno de trabajo

Si la entidad de servicio ya se ha agregado al área de trabajo mediante la API de entidades de servicio o la CLI de Databricks:

CLI de Databricks

databricks clusters list -p <profile-name-with-token>

curl

curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list

Entidades de servicio con rol de Azure

Si la entidad de servicio tiene el rol Contributor o Owner en el recurso del área de trabajo en Azure pero aún no está en el área de trabajo de Azure Databricks:

  1. Obtenga un token de administración para Azure Resource Manager:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/<tenant-id>/oauth2/token \
    -d 'client_id=<client-id>' \
    -d 'grant_type=client_credentials' \
    -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \
    -d 'client_secret=<client-secret>'
    
  2. Llame a la API de Databricks con ambos tokens:

    curl -X GET \
    -H 'Authorization: Bearer <databricks-access-token>' \
    -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
    -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \
    https://<databricks-instance>/api/2.0/clusters/list
    

Después de la primera autenticación, la entidad de servicio se convierte en administrador del área de trabajo.

Tokens de actualización

Si obtuvo un token de actualización con el token de acceso, úselo para obtener un nuevo token. Los tokens de acceso de Microsoft Entra ID expiran de forma predeterminada después de 60 a 90 minutos.

Guarde el código siguiente como refresh-tokens.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
refresh_token = sys.argv[3] if len(sys.argv) > 1 else '<refresh-token>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_refresh_token(
  refresh_token=refresh_token,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"\nNew access token:\n{result['access_token']}")
  print(f"\nNew refresh token:\n{result['refresh_token']}")

Ejecute el script:

python refresh-tokens.py <client-id> <tenant-id> <refresh-token>

Solución de problemas de token

En esta sección se describen los errores comunes de token y cómo validar los tokens de acceso.

No se pudo obtener el token con el nombre de usuario y la contraseña

The user or administrator has not consented to use the application with ID <client-id>.
Send an interactive authorization request for this user and resource.

Solución: Asegúrese de que el recurso AzureDatabricks se agrega a la aplicación. Use el flujo de código de autorización (método interactivo) para dar su consentimiento a los permisos. Después de dar su consentimiento, puede usar el flujo de nombre de usuario y contraseña. Consulte Obtención de tokens para usuarios.

Los URI de redirección no coinciden.

The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'

Solución: Compruebe que el URI de redireccionamiento de la solicitud coincide con uno configurado en la aplicación.

Validación de un token de acceso

Asegúrese de que el token de acceso del identificador de Entra de Microsoft incluye la información correcta. Consulte Validación de tokens.

  • aud: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (identificador de recurso de Databricks)
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: id. de inquilino del área de trabajo
  • nbf/exp: la hora actual se encuentra entre estos valores
  • unique_name: el usuario existe en el área de trabajo

Valide la firma mediante certificados públicos de los puntos de conexión de OIDC.

Descodificar sin comprobación de firma:

El código siguiente muestra la carga del token. Primero debe instalar la biblioteca PyJWT mediante pip install pyjwt y la biblioteca de criptografía mediante pip install cryptography.

import jwt

def decode_token(token):
  algorithm = jwt.get_unverified_header(token)['alg']
  decoded = jwt.decode(token, algorithms=[algorithm], options={"verify_signature": False})
  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Descodificar con comprobación de firma:

import jwt
import requests
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend

PEMSTART = '-----BEGIN CERTIFICATE-----\n'
PEMEND = '\n-----END CERTIFICATE-----\n'

def get_public_key_for_token(kid):
  response = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration').json()
  pubkeys = requests.get(response['jwks_uri']).json()['keys']

  for key in pubkeys:
    if key['kid'] == kid:
      cert_str = PEMSTART + str(key['x5c'][0]) + PEMEND
      cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
      return cert_obj.public_key()

def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  decoded = jwt.decode(access_token, key=public_key, algorithms='RS256',
                      audience='2ff814a6-3304-4ab8-85cb-cd0e6f879c1d')
  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Use descodificadores JWT en línea, como jwt.ms o jwt.io para tokens no confidenciales.