Problemen met Toegangstokens voor Microsoft Entra-id's oplossen
In dit artikel wordt beschreven hoe u fouten oplost die kunnen optreden bij het ophalen van Microsoft Entra ID-toegangstokens 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
- Als de AzureDatabricks-resource niet aan uw toepassing wordt toegevoegd, vraagt u een gebruiker met beheerdersrechten om deze toe te voegen.
- 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
enexp
- 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])}")
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.