Delen via


Problemen met toegangstokens voor Microsoft Entra ID (voorheen Azure Active Directory) oplossen

In dit artikel wordt beschreven hoe u fouten kunt oplossen die kunnen optreden bij het ophalen van Microsoft Entra ID-toegangstokens (voorheen Azure Active Directory) en het valideren van toegangstokens.

Kan token niet ophalen met behulp van gebruikersnaam en wachtwoord

Foutbericht

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

  1. Als de AzureDatabricks-resource niet aan uw toepassing wordt toegevoegd, vraagt u een Beheer gebruiker om deze toe te voegen.
  2. Gebruik de interactieve methode om het token op te halen. De webpagina begeleidt u bij het verlenen van machtigingen aan de toepassing. U kunt ook klikken op de knop Machtigingen verlenen die wordt beschreven in de toepassingsconfiguratie . Nadat machtigingen zijn verleend, kunt u de programmatische methode gebruiken om het token op te halen.

Omleidings-URI's komen niet overeen

Foutbericht

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 een van de omleidings-URI's in de toepassing.

Een toegangstoken valideren

Wanneer u een Microsoft Entra ID-toegangstoken hebt, kunt u controleren of het de juiste informatie bevat (zie tokens valideren).

Controleer of de volgende velden overeenkomen met de record:

  • aud: De resource-id van Azure Databricks: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: moet zijn https://sts.windows.net/<tenant-id>/
  • tid: Moet de tenant van de werkruimte zijn (zoek dit op op basis van de organisatie-id of de apparaat-id van de werkruimte)
  • nbf/exp: de huidige tijd moet tussen nbf en exp
  • unique_name: Moet een gebruiker zijn die bestaat in de Databricks-werkruimte, tenzij de gebruiker een inzender is voor de resource van het werkruimteapparaat

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

Hier volgt een codefragment waarin de nettolading van het token wordt weergegeven. 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])}")

Als u een volledige decodering (inclusief handtekeningverificatie) van het token wilt, kunt u het volgende codefragment gebruiken. U moet eerst de PyJWT-bibliotheek installeren met behulp van pip install pyjwt de cryptografiebibliotheek.pip install cryptography Zorg er ook voor dat u de volgende code vervangt <databricks-resource-id> :

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

Hier volgt een voorbeeld van de uitvoer van het bovenstaande codefragment:

Azure registered app settings

U kunt het gedecodeerde token ook bekijken via online JWT-decoders als ze niet gevoelig zijn. Voorbeelden van online decoders zijn jwt.ms en jwt.io.