Udostępnij za pośrednictwem


Rozwiązywanie problemów z tokenami dostępu identyfikatora entra firmy Microsoft

W tym artykule opisano, jak rozwiązywać problemy z błędami, które mogą wystąpić podczas uzyskiwania tokenów dostępu identyfikatora Entra firmy Microsoft i jak weryfikować tokeny dostępu.

Nie można pobrać tokenu przy użyciu nazwy użytkownika i hasła

Komunikat o błędzie

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.

Rozwiązanie

  1. Jeśli zasób usługi AzureDatabricks nie został dodany do aplikacji, poproś użytkownika administratora o dodanie go.
  2. Użyj metody interaktywnej, aby uzyskać token. Strona internetowa przeprowadzi Cię przez proces udzielania uprawnień do aplikacji. Alternatywnie kliknij przycisk Udziel uprawnień opisany w konfiguracji aplikacji. Po udzieleniu uprawnień możesz użyć metody programowej, aby uzyskać token.

Identyfikatory URI przekierowania są niezgodne

Komunikat o błędzie

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

Rozwiązanie

Sprawdź, czy identyfikator URI przekierowania w żądaniu jest zgodny z jednym z tych w aplikacji.

Weryfikowanie tokenu dostępu

Jeśli masz token dostępu microsoft Entra ID, możesz sprawdzić, czy zawiera poprawne informacje (zobacz weryfikowanie tokenów).

Należy sprawdzić, czy następujące pola są zgodne z rekordem:

  • aud: Identyfikator zasobu usługi Azure Databricks: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: Powinna być https://sts.windows.net/<tenant-id>/
  • tid: powinien być dzierżawą obszaru roboczego (wyszukaj go według identyfikatora organizacji lub identyfikatora urządzenia obszaru roboczego)
  • nbf/exp: Bieżący czas powinien przypadać między nbf i exp
  • unique_name: powinien być użytkownikiem istniejącym w obszarze roboczym usługi Databricks, chyba że użytkownik jest współautorem zasobu urządzenia obszaru roboczego

Zweryfikuj podpis tokenu przy użyciu publicznych certyfikatów z punktów końcowych OIDC.

Oto fragment kodu, który pokazuje ładunek tokenu. Najpierw należy zainstalować bibliotekę PyJWT przy użyciu biblioteki i bibliotekę kryptografii przy użyciu pip install pyjwt polecenia 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])}")

Jeśli chcesz wykonać pełne dekodowanie (w tym weryfikację podpisu) tokenu, możesz użyć następującego fragmentu kodu. Najpierw należy zainstalować bibliotekę PyJWT przy użyciu biblioteki i bibliotekę kryptografii przy użyciu pip install pyjwt polecenia pip install cryptography. Pamiętaj również, aby zastąpić <databricks-resource-id> element w następującym kodzie:

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

Możesz również wyświetlić zdekodowany token za pomocą dekodatorów JWT online, jeśli nie są poufne. Przykłady dekodatorów online to jwt.ms i jwt.io.