Поделиться через


Устранение неполадок маркеров доступа к идентификаторам Microsoft Entra

В этой статье описывается, как устранять ошибки при получении маркеров доступа идентификатора 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.

Решение

  1. Если ресурс AzureDatabricks не добавлен в приложение, попросите администратора добавить его.
  2. Для получения маркера используйте интерактивный метод. Средства веб-страницы помогут предоставить приложению разрешения. Кроме того, можно нажать кнопку Предоставить разрешения, описанную в разделе «Конфигурация приложения». После предоставления разрешений для получения маркера можно использовать программный метод.

Универсальные коды ресурса (URI) перенаправления не совпадают

Сообщение об ошибке

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

Решение

Убедитесь, что URI перенаправления в запросе соответствует одному из кодов в приложении.

Проверка маркера доступа

Если у вас есть маркер доступа к идентификатору Microsoft Entra, вы можете убедиться, что он содержит правильные сведения (см . маркеры проверки).

Убедитесь, что следующие поля соответствуют записям:

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

Ниже приведен пример выходных данных из приведенного выше фрагмента кода:

Настройки зарегистрированного приложения Azure

Декодированный маркер также можно просмотреть с помощью сетевых декодеров, если они не являются конфиденциальными. Примерами сетевых декодеров являются jwt.ms и jwt.io.