Ruční získání tokenů ID Microsoft Entra

Tato stránka popisuje, jak ručně generovat přístupové tokeny Microsoft Entra ID pro účely ověřování uživatelů a služebních identit pomocí rozhraní REST API Azure Databricks. Ruční generování tokenů je pokročilá technika.

Důležité

Databricks nedoporučuje ručně vytvářet tokeny ID Microsoft Entra. Platnost vyprší do jedné hodiny a vyžaduje ruční nahrazení. Místo toho používejte nástroje nebo sady SDK s jednotným ověřováním k automatickému zpracování správy tokenů.

Pro většinu případů použití používejte spravované služební identity Azure Databricks. Instanční objekty spravované pomocí Microsoft Entra ID používejte jenom v případě, že potřebujete přístup k prostředkům Azure, protože vyžadují další oprávnění Microsoft Entra ID.

Kdy použít ruční generování tokenů

Ruční generování tokenů používejte pouze v případech:

  • Potřebujete integraci se systémy, které nemůžou používat Azure CLI nebo jednotné ověřování.
  • Vyžadujete explicitní kontrolu nad životním cyklem tokenů a aktualizací.
  • Řešíte problémy s ověřováním.

Pro všechny ostatní případy použití použijte doporučené metody ověřování, které zpracovávají správu tokenů automaticky.

Získání tokenů pro uživatele

Pomocí Azure CLI nebo knihovny Microsoft Authentication Library (MSAL) získejte přístupové tokeny Microsoft Entra ID pro uživatele.

Metoda Azure CLI

  1. Získejte ID předplatného Azure pro váš uživatelský účet:

    • Z pracovního prostoru Azure Databricks: Klikněte na přehled svého uživatelského jména > na webu Azure Portal> a vyhledejte ID předplatného.

    • Pomocí Azure CLI: Spusťte následující příkaz (nahraďte adresou URL pracovního prostoru):

      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
      

      To 00000000-0000-0000-0000-000000000000, co se nachází za /subscriptions/, je ID vašeho předplatného.

      Pokud se zobrazí chyba tenanta, přihlaste se ke správnému tenantovi:

      az login -t <tenant-id>
      

      Viz Získání ID předplatného a tenanta na webu Azure Portal.

  2. Přihlaste se k Azure:

    az login
    
  3. Nastavte správné předplatné:

    az account set -s <subscription-id>
    
  4. Vygenerujte přístupový token:

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

    ID 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d prostředku je standardní identifikátor Azure Databricks ve všech prostředích Azure.

Metoda MSAL

Pomocí knihovny Microsoft Authentication Library (MSAL) programově získejte přístupové tokeny Microsoft Entra ID. MSAL podporuje dva toky:

  • Průběh autorizačního kódu (interaktivní): Otevře prohlížeč pro přihlášení uživatele. Tuto možnost použijte, pokud je povolené dvoufaktorové nebo federované ověřování nebo když se vyžaduje souhlas správce.
  • Tok uživatelského jména a hesla (programový): Ověřuje se pomocí uživatelského jména a hesla. Tuto možnost použijte jenom v případě, že máte oprávnění k přihlášení prostřednictvím kódu programu.

Před použitím knihovny MSAL je nutné zaregistrovat aplikaci v Microsoft Entra ID. Viz Registrace aplikace pomocí webu Azure Portal. Při registraci:

  1. Nastavte podporované typy účtůna Účty pouze v tomto organizačním adresáři (jeden tenant).
  2. Nastavte přesměrovací URI na veřejný klient/nativní (mobilní & desktop) s hodnotou .
  3. Poznamenejte si ID aplikace (klienta) a ID adresáře (tenanta) ze stránky Přehled aplikace.
  4. Přidejte oprávnění rozhraní API AzureDatabricks :
    1. Přejděte na Oprávnění rozhraní API> a Přidat oprávnění.
    2. Vyhledejte a vyberte AzureDatabricks.
    3. Povolte user_impersonation a klikněte na Přidat oprávnění.
    4. Klikněte na Udělit souhlas správce (vyžaduje oprávnění správce).

Tok autorizačního kódu

Nainstalujte MSAL Python SDK:

pip install msal

Uložte následující kód jako 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']}")

Spusťte skript:

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

Tok uživatelského jména a hesla

Uložte následující kód jako 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']}")

Spusťte skript:

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

Získání tokenů pro služební účty

Služební principály využívají tok přihlašovacích údajů klienta OAuth 2.0 a jejich řízení přístupu může být odlišné od řízení běžných uživatelů.

Vytvořte služebního principála

Pokud nemáte hlavní účet služby, vytvořte ho pomocí Azure portálu nebo Azure CLI.

Azure Portal

  1. Přihlaste se do Azure Portalu.
  2. V případě potřeby přepněte na správného nájemce pomocí Directories + subscriptions.
  3. Vyhledejte a vyberte Microsoft Entra ID.
  4. Klikněte na + Přidat>registraci aplikace.
  5. Zadejte název a vyberte Účty pouze v tomto adresáři organizace (jediný tenant).
  6. Klikněte na Zaregistrovat.
  7. Zkopírujte tyto hodnoty ze stránky Přehled :
    • ID aplikace (klienta)
    • ID adresáře (tenanta)
  8. Přejděte na Certifikáty a tajné>kódy> klientaNové tajné klíče klienta.
  9. Přidejte popis, nastavte období vypršení platnosti a klikněte na Přidat.
  10. Zkopírujte a bezpečně uložte Value tajného klíče klienta.

Azure CLI (příkazový řádek nástroje Azure)

Úplné pokyny najdete v tématu Vytvoření instančního objektu Azure pomocí Azure CLI .

Vygenerování tokenu

Vygenerujte token pomocí rozhraní REST API nebo Azure CLI. Nejprve shromážděte následující informace:

  • ID tenanta:ID adresáře (tenanta) z Microsoft Entra ID
  • ID klienta:ID aplikace (klienta) z Microsoft Entra ID
  • Tajný klíč klienta:Hodnota tajného klíče klienta z ID Microsoft Entra

Metoda rozhraní REST API

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

Přístupový token je v access_token poli odpovědi.

Metoda Azure CLI

  1. Získejte ID předplatného Azure. Viz Získání tokenů pro uživatele.

  2. Přihlaste se pomocí služebního principálu:

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. Nastavte správné předplatné:

    az account set -s <subscription-id>
    
  4. Vygenerujte přístupový token:

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

Použití tokenů s rozhraními Databricks API

Po vygenerování tokenu ho použijte s rozhraním Databricks REST API.

Služební identity v pracovním prostoru

Pokud už je váš instanční objekt přidaný do pracovního prostoru pomocí rozhraní API instančních objektů nebo rozhraní příkazového řádku Databricks:

Příkazové rozhraní Databricks

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

kroucení

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

Účastníci služby s rolí Azure

Pokud má váš instanční objekt služby roli Contributor nebo Owner pro prostředek pracovního prostoru v Azure, ale ještě není v pracovním prostoru Azure Databricks:

  1. Získání tokenu pro správu pro 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. Zavolejte Databricks API s oběma tokeny:

    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
    

Po prvním ověření se principál služby stane správcem pracovního prostoru.

Aktualizace tokenů

Pokud jste získali obnovovací token s přístupovým tokenem, použijte ho k získání nového tokenu. Platnost přístupových tokenů Microsoft Entra ID vyprší po 60 až 90 minutách.

Uložte následující kód jako 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']}")

Spusťte skript:

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

Řešení potíží s tokeny

Tato část popisuje běžné chyby tokenů a způsob ověřování přístupových tokenů.

Nepodařilo se získat token s uživatelským jménem a heslem

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.

Řešení: Ujistěte se, že je prostředek AzureDatabricks přidaný do vaší aplikace. K vyjádření souhlasu s oprávněními použijte tok autorizačního kódu (interaktivní metoda). Po vyjádření souhlasu můžete použít tok uživatelského jména a hesla. Viz Získání tokenů pro uživatele.

URI pro přesměrování se neshodují

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

Řešení: Ověřte, že identifikátor URI přesměrování v požadavku odpovídá identifikátoru URI přesměrování nakonfigurovaného v aplikaci.

Ověření přístupového tokenu

Ujistěte se, že přístupový token Microsoft Entra ID obsahuje správné informace. Viz ověření tokenů.

  • aud: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (ID prostředku Databricks)
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: ID tenanta pracovního prostoru
  • nbf/exp: Aktuální čas spadá mezi tyto hodnoty
  • unique_name: Uživatel existuje v pracovním prostoru.

Ověřte podpis pomocí veřejných certifikátů z koncových bodů OIDC.

Dekódování bez ověření podpisu:

Následující kód ukazuje datovou část tokenu. Nejprve je nutné nainstalovat knihovnu PyJWT pomocí pip install pyjwt a kryptografické knihovny pomocí 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])}")

Dekódování pomocí ověření podpisu:

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

Používejte online dekodéry JWT, jako jwt.ms nebo jwt.io pro necitlivé tokeny.