Felsöka Åtkomsttoken för Microsoft Entra-ID (tidigare Azure Active Directory)

Den här artikeln beskriver hur du felsöker fel som kan uppstå när du hämtar Åtkomsttoken för Microsoft Entra-ID (tidigare Azure Active Directory) och hur du verifierar åtkomsttoken.

Det gick inte att hämta token med användarnamn och lösenord

Felmeddelande

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.

Lösning

  1. Om AzureDatabricks-resursen inte har lagts till i ditt program ber du en administratörsanvändare att lägga till den.
  2. Använd den interaktiva metoden för att hämta token. På webbsidan får du hjälp med att bevilja behörigheter till programmet. Du kan också klicka på knappen Bevilja behörigheter som beskrivs i programkonfigurationen. När behörigheter har beviljats kan du använda den programmatiska metoden för att hämta token.

Omdirigerings-URI:er matchar inte

Felmeddelande

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

Lösning

Kontrollera att omdirigerings-URI:n i din begäran matchar en av dem i programmet.

Verifiera en åtkomsttoken

När du har en Åtkomsttoken för Microsoft Entra-ID kan du kontrollera att den innehåller rätt information (se verifiera token).

Du bör kontrollera att följande fält matchar posten:

  • aud: Resurs-ID:t för Azure Databricks: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: Ska vara https://sts.windows.net/<tenant-id>/
  • tid: Ska vara klientorganisation för arbetsytan (leta upp detta antingen efter organisations-ID eller arbetsyteinstallations-ID)
  • nbf/exp: Aktuell tid bör falla mellan nbf och exp
  • unique_name: Ska vara en användare som finns på Databricks-arbetsytan, såvida inte användaren är deltagare i arbetsyteinstallationsresursen

Verifiera tokens signatur med hjälp av offentliga certifikat från OIDC-slutpunkterna.

Här är ett kodfragment som visar nyttolasten för token. Du måste först installera PyJWT-biblioteket med hjälp av pip install pyjwt och kryptografibiblioteket med hjälp av 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])}")

Om du vill ha en fullständig avkodning (inklusive signaturverifiering) av token kan du använda följande kodfragment. Du måste först installera PyJWT-biblioteket med hjälp av pip install pyjwt och kryptografibiblioteket med .pip install cryptography Se också till att ersätta <databricks-resource-id> i följande kod:

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'

# Get the Microsoft Azure public key.
def get_public_key_for_token(kid):
  response = requests.get(
    'https://login.microsoftonline.com/common/.well-known/openid-configuration',
  ).json()

  jwt_uri = response['jwks_uri']
  response_keys = requests.get(jwt_uri).json()
  pubkeys = response_keys['keys']

  public_key = ''

  for key in pubkeys:
    # Find the key that matches the kid in the token's header.
      if key['kid'] == kid:
        # Construct the public key object.
        mspubkey = str(key['x5c'][0])
        cert_str = PEMSTART + mspubkey + PEMEND
        cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
        public_key = cert_obj.public_key()

  return public_key

# Decode the given <ms-entra-id> token.
def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  # The value of the databricks_resource_id is as defined previously,
  # for example, databricks_resource_id = "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"
  decoded = jwt.decode(
    access_token,
    key = public_key,
    algorithms = 'RS256',
    audience = '<databricks-resource-id>')

  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Här är ett exempel på utdata från kodfragmentet ovan:

Azure registered app settings

Du kan också visa den avkodade token via JWT-avkodare online om de inte är känsliga. Exempel på onlinedekodare är jwt.ms och jwt.io.