Résoudre les problèmes des jetons d’accès Microsoft Entra ID (anciennement Azure Active Directory)

Cet article explique comment résoudre les erreurs que vous pouvez rencontrer pendant l’obtention de jetons d’accès Microsoft Entra ID (anciennement Azure Active Directory) et comment valider les jetons d’accès.

Échec de l’obtention du jeton en utilisant le nom d’utilisateur et le mot de passe

Message d’erreur

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.

Solution

  1. Si la ressource AzureDatabricks n’est pas ajoutée à votre application, demandez à un utilisateur administrateur de l’ajouter.
  2. Utilisez la méthode interactive pour obtenir le jeton. La page web vous guidera pour accorder des autorisations à l’application. Vous pouvez également cliquer sur le bouton Grant permissions décrit dans la configuration de l’application. Une fois les autorisations accordées, vous pouvez utiliser la méthode par programmation pour obtenir le jeton.

Les URI de redirection ne correspondent pas

Message d’erreur

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

Solution

Vérifiez que l’URI de redirection de votre requête correspond à l’un de ceux de l’application.

Valider un jeton d’accès

Quand vous avez un jeton d’accès Microsoft Entra ID, vous pouvez vérifier qu’il contient les informations correctes (consultez Validation des jetons).

Vous devez vérifier que les champs suivants correspondent à l’enregistrement :

  • aud : ID de ressource Azure Databricks : 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss : doit être https://sts.windows.net/<tenant-id>/
  • tid : doit être le locataire de l’espace de travail (recherchez-le par ID d’organisation ou par ID d’appliance d’espace de travail)
  • nbf/exp : l’heure actuelle doit être comprise entre nbf et exp
  • unique_name : doit être un utilisateur qui existe dans l’espace de travail Databricks, sauf si l’utilisateur est un contributeur sur la ressource de l’appliance d’espace de travail

Validez la signature du jeton à l’aide des certificats publics des points de terminaison OIDC.

Voici un extrait de code qui affiche la charge utile du jeton. Vous devez d'abord installer la bibliothèque PyJWT en utilisant pip install pyjwt et la bibliothèque de cryptographie en utilisant 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])}")

Si vous souhaitez un décodage complet (y compris la vérification de la signature) du jeton, vous pouvez utiliser l'extrait de code suivant. Vous devez d'abord installer la bibliothèque PyJWT en utilisant pip install pyjwt et la bibliothèque de cryptographie en utilisant pip install cryptography. Assurez-vous également de remplacer <databricks-resource-id> dans le code suivant :

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

Voici un exemple de la sortie de l’extrait de code ci-dessus :

Azure registered app settings

Vous pouvez également afficher le jeton décodé par le biais de décodeurs JWT en ligne s’ils ne sont pas sensibles. jwt.ms et jwt.io sont des exemples de décodeurs en ligne.