Delen via


Microsoft Entra ID-tokens handmatig ophalen

Op deze pagina wordt beschreven hoe u handmatig toegangstokens voor Microsoft Entra-id's genereert voor gebruikers en service-principals voor verificatie met Azure Databricks REST API's. Handmatige tokengeneratie is een geavanceerde techniek.

Belangrijk

Databricks raadt niet aan om handmatig Microsoft Entra ID-tokens te maken. Ze verlopen binnen één uur en vereisen handmatige vervanging. Gebruik in plaats daarvan hulpprogramma's of SDK's met geïntegreerde verificatie om tokenbeheer automatisch af te handelen.

Gebruik beheerde service-principals van Azure Databricks voor de meeste toepassingen. Gebruik alleen door Microsoft Entra ID beheerde service-principals wanneer u toegang nodig hebt tot Azure-resources, omdat hiervoor aanvullende Microsoft Entra ID-machtigingen zijn vereist.

Wanneer gebruikt u handmatige tokengeneratie

Gebruik handmatige tokengeneratie alleen wanneer:

  • U moet integreren met systemen die geen gebruik kunnen maken van Azure CLI of geïntegreerde verificatie
  • U hebt expliciete controle nodig over de levenscyclus en vernieuwing van tokens
  • U bent het debuggen van authenticatieproblemen

Gebruik voor alle andere use cases de aanbevolen verificatiemethoden die tokenbeheer automatisch verwerken.

Tokens ophalen voor gebruikers

Gebruik de Azure CLI of de Microsoft Authentication Library (MSAL) om toegangstokens voor Microsoft Entra-id's voor gebruikers op te halen.

Azure CLI-methode

  1. Haal de Azure-abonnements-id op voor uw gebruikersaccount:

    • Vanuit de Azure Databricks-werkruimte: Klik op het> van uw gebruikersnaam > en zoek de abonnements-id.

    • Met de Azure CLI: Voer de volgende opdracht uit (vervang door de URL van uw werkruimte):

      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
      

      De 00000000-0000-0000-0000-000000000000 volgende /subscriptions/ is uw abonnements-id.

      Als er een huurderfout optreedt, log in bij de juiste tenant.

      az login -t <tenant-id>
      

      Zie Abonnements- en tenant-id's ophalen in Azure Portal.

  2. Meld u aan bij Azure:

    az login
    
  3. Stel het juiste abonnement in:

    az account set -s <subscription-id>
    
  4. Genereer het toegangstoken:

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

    De resource-id 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d is de standaard-id voor Azure Databricks in alle Azure-omgevingen.

MSAL-methode

Gebruik de Microsoft Authentication Library (MSAL) om toegangstokens van Microsoft Entra ID programmatisch op te halen. MSAL ondersteunt twee stromen:

  • Autorisatiecodestroom (interactief): Hiermee start u een browser voor gebruikersaanmelding. Gebruik deze optie wanneer tweeledige of federatieve verificatie is ingeschakeld of wanneer beheerderstoestemming is vereist.
  • Stroom voor gebruikersnaam-wachtwoord (programmatisch): Verifieert met een gebruikersnaam en wachtwoord. Gebruik dit alleen wanneer u gemachtigd bent om u programmatisch aan te melden.

Voordat u MSAL gebruikt, moet u een toepassing registreren in Microsoft Entra-id. Zie Een app registreren met behulp van Azure Portal. Bij het registreren:

  1. Stel ondersteunde accounttypenalleen in op Accounts in deze organisatiemap (één tenant).
  2. Stel Redirect-URI in op publieke client/natieve (mobiel en desktop) met de waarde http://localhost.
  3. Noteer de toepassings-id (client) en directory-id (tenant) van de Overzicht pagina van de app.
  4. Voeg de azureDatabricks-API-machtiging toe:
    1. Ga naar API-machtigingen>Voeg een machtiging toe.
    2. Zoek en selecteer AzureDatabricks.
    3. Schakel user_impersonation in en klik op Machtigingen toevoegen.
    4. Klik op Beheerderstoestemming verlenen (hiervoor zijn beheerdersbevoegdheden vereist).

Autorisatiecodeproces

Installeer de MSAL Python SDK:

pip install msal

Sla de volgende code op als 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']}")

Voer het script uit:

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

Gebruikersnaam-wachtwoordproces

Sla de volgende code op als 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']}")

Voer het script uit:

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

Tokens ophalen voor service-principals

Service-principals maken gebruik van de OAuth 2.0-clientreferentiestroom en kunnen een ander toegangsbeheer hebben dan gewone gebruikers.

Een service-principal maken

Als u geen service-principal hebt, maakt u er een met behulp van Azure Portal of Azure CLI:

Azure Portal

  1. Meld u aan bij het Azure-portaal.
  2. Schakel indien nodig over naar de juiste tenant met directories en abonnementen.
  3. Zoek en selecteer Microsoft Entra-id.
  4. Klik op +App-registratie>.
  5. Voer een naam in en selecteer alleen accounts in deze organisatiemap (één tenant).
  6. Klik op Registreren.
  7. Kopieer deze waarden op de pagina Overzicht :
    • Applicatie (cliënt) ID
    • Directory (huurder) ID
  8. Ga naar Certificaten en geheimen>Clientgeheimen>Nieuw clientgeheim.
  9. Voeg een beschrijving toe, stel een verloopperiode in en klik op Toevoegen.
  10. Kopieer en sla de waarde van het clientgeheim veilig op.

Azure-opdrachtregelinterface (CLI)

Zie Een Azure-service-principal maken met Azure CLI voor volledige instructies.

Een token genereren

Genereer een token met behulp van de REST API of Azure CLI. Verzamel eerst de volgende informatie:

  • Tenant-id: De directory-id (tenant) van Microsoft Entra ID
  • Client-id: De toepassings-id (client) van Microsoft Entra-id
  • Clientgeheim: De waarde van het clientgeheim van Microsoft Entra-id

REST API-methode

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>'

Het toegangstoken bevindt zich in het access_token veld van het antwoord.

Azure CLI-methode

  1. Haal uw Azure-abonnements-id op. Zie Tokens ophalen voor gebruikers.

  2. Meld u aan met uw service-principal:

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. Stel het juiste abonnement in:

    az account set -s <subscription-id>
    
  4. Genereer het toegangstoken:

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

Tokens gebruiken met Databricks-API's

Nadat u een token hebt gegenereerd, gebruikt u dit met de Databricks REST API.

Service-principals in de werkruimte

Als uw service principal al is toegevoegd aan de werkruimte via de Service Principals API of Databricks CLI:

Databricks-CLI

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

Service-principals met Azure-rol

Als uw service-principal de rol Contributor of Owner heeft voor de werkruimteresource in Azure, maar nog niet in de werkruimte van Azure Databricks is:

  1. Een beheertoken ophalen voor 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. Roep de Databricks-API aan met beide 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
    

Na de eerste verificatie wordt de service-principal een werkruimtebeheerder.

Vernieuwen van tokens

Als u een verversingstoken met uw toegangstoken heeft verkregen, gebruikt u dit om een nieuw token op te halen. Microsoft Entra ID-toegangstokens verlopen standaard na 60-90 minuten.

Sla de volgende code op als 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']}")

Voer het script uit:

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

Tokenproblemen oplossen

In deze sectie worden veelvoorkomende tokenfouten beschreven en hoe u toegangstokens valideert.

Kan token niet ophalen met gebruikersnaam en wachtwoord

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.

Oplossing: Zorg ervoor dat de AzureDatabricks-resource is toegevoegd aan uw toepassing. Gebruik de autorisatiecodestroom (interactieve methode) om toestemming te geven voor machtigingen. Nadat u toestemming hebt gegeven, kunt u de gebruikersnaam-wachtwoordstroom gebruiken. Zie Tokens ophalen voor gebruikers.

Omleidings-URI's komen niet overeen

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

Oplossing: Controleer of de omleidings-URI in uw aanvraag overeenkomt met de omleidings-URI die is geconfigureerd in de toepassing.

Een toegangstoken valideren

Zorg ervoor dat uw Microsoft Entra ID-toegangstoken de juiste informatie bevat. Zie tokens valideren.

  • aud: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (Databricks-resource-id)
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: Tenant-id van werkruimte
  • nbf/exp: de huidige tijd valt tussen deze waarden
  • unique_name: Gebruiker is aanwezig in de werkplek

Valideer de handtekening met behulp van openbare certificaten van de OIDC-eindpunten.

Decoderen zonder handtekeningverificatie:

De volgende code toont de payload van het token. U moet eerst de PyJWT-bibliotheek installeren met behulp van pip install pyjwt en de cryptografiebibliotheek met behulp van 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])}")

Decoderen met handtekeningverificatie:

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

Gebruik online JWT-decoders zoals jwt.ms of jwt.io voor niet-gevoelige tokens.