Risolvere i problemi relativi ai token di accesso di Microsoft Entra ID

Questo articolo descrive come risolvere gli errori che possono verificarsi quando si ottengono i token di accesso a Microsoft Entra ID e come convalidare i token di accesso.

Impossibile ottenere il token usando nome utente e password

Messaggio di errore

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.

Soluzione

  1. Se la risorsa AzureDatabricks non viene aggiunta all'applicazione, chiedere a un utente amministratore di aggiungerla.
  2. Usare il metodo interattivo per ottenere il token. La pagina Web consentirà di concedere le autorizzazioni all'applicazione. In alternativa, fare clic sul pulsante Concedi autorizzazioni descritto nella configurazione dell'applicazione. Dopo aver concesso le autorizzazioni, è possibile usare il metodo programmatico per ottenere il token.

Gli URI di reindirizzamento non corrispondono

Messaggio di errore

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

Soluzione

Verificare che l'URI di reindirizzamento nella richiesta corrisponda a uno di quelli nell'applicazione.

Convalidare un token di accesso

Quando si dispone di un token di accesso microsoft Entra ID, è possibile verificare che includa le informazioni corrette (vedere convalidare i token).

È necessario verificare che i campi seguenti corrispondano al record:

  • aud: ID risorsa di Azure Databricks: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: deve essere https://sts.windows.net/<tenant-id>/
  • tid: deve essere il tenant dell'area di lavoro (cercarlo in base all'ID organizzazione o all'ID dell'appliance dell'area di lavoro)
  • nbf/exp: l'ora corrente deve essere compresa tra nbf e exp
  • unique_name: deve essere un utente presente nell'area di lavoro di Databricks, a meno che l'utente non sia un collaboratore nella risorsa dell'appliance dell'area di lavoro

Convalidare la firma del token usando i certificati pubblici dagli endpoint OIDC.

Ecco un frammento di codice che mostra il payload del token. È prima necessario installare la libreria PyJWT usando pip install pyjwt e la libreria di crittografia usando 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])}")

Se si vuole una decodifica completa (inclusa la verifica della firma) del token, è possibile usare il frammento di codice seguente. È prima necessario installare la libreria PyJWT usando pip install pyjwt e la libreria di crittografia usando pip install cryptography. Assicurarsi inoltre di sostituire <databricks-resource-id> nel codice seguente:

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

Di seguito è riportato un esempio dell'output del frammento di codice precedente:

Impostazioni dell'app registrata in Azure

È anche possibile visualizzare il token decodificato tramite decodificatori JWT online se non sono sensibili. Esempi di decodificatori online sono jwt.ms e jwt.io.