Řešení potíží s přístupovými tokeny Microsoft Entra ID
Tento článek popisuje, jak řešit chyby, ke kterým může dojít při získávání přístupových tokenů Microsoft Entra ID a jak ověřit přístupové tokeny.
Nepodařilo se získat token pomocí uživatelského jména a hesla
Chybová zpráva
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.
Řešení
- Pokud se prostředek AzureDatabricks nepřidá do vaší aplikace, požádejte uživatele správce, aby ho přidal.
- K získání tokenu použijte interaktivní metodu . Webová stránka vás provede udělením oprávnění k aplikaci. Případně klikněte na tlačítko Udělit oprávnění popsaná v konfiguraci aplikace. Po udělení oprávnění můžete k získání tokenu použít programovou metodu.
Identifikátory URI pro přesměrování se neshodují
Chybová zpráva
The reply url specified in the request does not match the reply urls configured for the application: '<application-id>'
Řešení
Zkontrolujte, jestli identifikátor URI přesměrování v požadavku odpovídá jednomu z identifikátorů v aplikaci.
Ověření přístupového tokenu
Pokud máte přístupový token Microsoft Entra ID, můžete ověřit, že obsahuje správné informace (viz ověření tokenů).
Měli byste ověřit, že následující pole odpovídají záznamu:
- aud: ID prostředku Azure Databricks:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
- iss: Měla by být
https://sts.windows.net/<tenant-id>/
- tid: Měl by být tenantem pracovního prostoru (vyhledejte ho podle ID organizace nebo ID zařízení pracovního prostoru).
- nbf/exp: Aktuální čas by měl spadat mezi
nbf
aexp
- unique_name: Měl by to být uživatel, který existuje v pracovním prostoru Databricks, pokud uživatel není přispěvatelem prostředku zařízení pracovního prostoru.
Ověřte podpis tokenu pomocí veřejných certifikátů z koncových bodů OIDC.
Tady je fragment kódu, který ukazuje datovou část tokenu. Nejprve je nutné nainstalovat knihovnu PyJWT pomocí pip install pyjwt
a kryptografické knihovny pomocí 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])}")
Pokud chcete úplné dekódování tokenu (včetně ověření podpisu), můžete použít následující fragment kódu. Nejprve je nutné nainstalovat knihovnu PyJWT pomocí pip install pyjwt
a kryptografické knihovny pomocí pip install cryptography
. Nezapomeňte také nahradit <databricks-resource-id>
v následujícím kódu:
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])}")
Tady je příklad výstupu z výše uvedeného fragmentu kódu:
Dekódovaný token můžete také zobrazit prostřednictvím online dekodérů JWT, pokud nejsou citlivé. Příklady online dekodérů jsou jwt.ms a jwt.io.