Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как устранять ошибки при получении токенов доступа идентификатора Microsoft Entra и как проверять токены доступа.
Не удалось получить токен, используя имя пользователя и пароль
Сообщение об ошибке
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.
Решение
- Если ресурс AzureDatabricks не добавлен в приложение, попросите администратора добавить его.
- Используйте интерактивный метод для получения маркера. Веб-страница поможет вам предоставить приложению разрешения. Кроме того, можно нажать кнопку Предоставить разрешения, описанную в разделе «Конфигурация приложения». После предоставления разрешений для получения токена можно использовать программный метод.
URI перенаправления не совпадают
Сообщение об ошибке
The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'
Решение
Убедитесь, что URI перенаправления в запросе соответствует одному из кодов в приложении.
Проверить токен доступа
Если у вас есть токен доступа Microsoft Entra ID, вы можете убедиться, что он содержит правильные сведения (см. проверку токенов).
Убедитесь, что следующие поля соответствуют записям:
-
aud: идентификатор ресурса Azure Databricks:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
-
iss: должно быть
https://sts.windows.net/<tenant-id>/
- tid: должен быть арендатором рабочей области (это можно проверить с помощью идентификатора организации или идентификатора рабочей области)
-
nbf/exp: текущее время должно находиться в диапазоне от
nbf
доexp
- unique_name: должен быть пользователем, который существует в рабочей области Databricks, если пользователь не является участником в ресурсе устройства рабочей области
Проверьте подпись токена с помощью открытых сертификатов из конечных точек OIDC.
Вот фрагмент кода, показывающий полезную нагрузку маркера. Сначала необходимо установить библиотеку PyJWT с помощью pip install pyjwt
, а библиотеку криптографии с помощью 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])}")
Если требуется полное декодирование (включая проверку подписи) маркера, можно использовать следующий фрагмент кода. Сначала необходимо установить библиотеку PyJWT с помощью pip install pyjwt
и библиотеку шифрования.pip install cryptography
Убедитесь, что заменили <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])}")
Декодированный токен также можно просмотреть с помощью онлайн-декодеров, если они не являются конфиденциальными. Примерами сетевых декодеров являются jwt.ms и jwt.io.