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


Получить токены идентификатора Microsoft Entra вручную

На этой странице описывается, как вручную создавать маркеры доступа Microsoft Entra ID для пользователей и служебных принципалов для аутентификации с REST API Azure Databricks. Генерация токенов вручную — это продвинутая методика.

Это важно

Databricks не рекомендует вручную создавать токены Microsoft Entra ID. Срок действия истекает в течение одного часа и требует ручной замены. Вместо этого используйте средства или пакеты SDK с унифицированной проверкой подлинности для автоматического управления маркерами.

Для большинства случаев использования используйте управляемые субъекты-службы Azure Databricks. Используйте только управляемые участники-службы Microsoft Entra ID, если необходимо получить доступ к ресурсам Azure, так как для этого требуются дополнительные разрешения Microsoft Entra ID.

Когда следует использовать генерацию токенов вручную

Используйте создание маркеров вручную только в том случае, если:

  • Необходимо интегрировать с системами, которые не могут использовать Azure CLI или единую проверку подлинности
  • Вам требуется явный контроль над жизненным циклом токена и его обновлением
  • Вы устраняете проблемы с проверкой подлинности

Для всех других вариантов использования используйте рекомендуемые методы проверки подлинности, которые обрабатывают управление маркерами автоматически.

Получение токенов для пользователей

Используйте Azure CLI или библиотеку аутентификации Microsoft (MSAL), чтобы получить токены доступа к Microsoft Entra ID для пользователей.

Метод Azure CLI

  1. Получите идентификатор подписки Azure для учетной записи пользователя:

    • Из рабочей области Azure Databricks: Щелкните свое имя пользователя >на портале> Azure и найдите идентификатор подписки.

    • С помощью Azure CLI: Выполните следующую команду (замените URL-адрес рабочей области):

      az databricks workspace list --query "[?workspaceUrl==\`adb-0000000000000000.0.azuredatabricks.net\`].{id:id}" -o tsv
      
      # /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Databricks/workspaces/my-ws
      

      Идентификатор подписки после 00000000-0000-0000-0000-000000000000 и /subscriptions/.

      Если вы получаете ошибку арендатора, войдите в нужного арендатора.

      az login -t <tenant-id>
      

      Ознакомьтесь с идентификаторами подписок и клиентов на портале Azure.

  2. Войдите в Azure:

    az login
    
  3. Задайте правильную подписку:

    az account set -s <subscription-id>
    
  4. Создайте маркер доступа:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

    Идентификатор ресурса 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d — это стандартный идентификатор для Azure Databricks во всех средах Azure.

Метод MSAL

Используйте библиотеку проверки подлинности Microsoft (MSAL) для программного получения токенов доступа Microsoft Entra ID. MSAL поддерживает два потока:

  • Поток кода авторизации (интерактивный): Запускает браузер для входа пользователя. Используйте это, если включена двухфакторная или федеративная проверка подлинности или когда требуется согласие администратора.
  • Поток паролей имени пользователя (программный): Выполняет проверку подлинности с помощью имени пользователя и пароля. Используйте это только при наличии полномочий для программного входа.

Перед использованием MSAL необходимо зарегистрировать приложение в идентификаторе Microsoft Entra. См . статью "Регистрация приложения с помощью портала Azure". При регистрации:

  1. Задайте Поддерживаемые типы учетных записейтолько для учетных записей в каталоге этой организации (единственный арендатор).
  2. Задайте URI перенаправления на публичный клиент/собственный (мобильный и настольный) со значением http://localhost.
  3. Обратите внимание на идентификатор приложения (клиента) и идентификатор каталога (клиента) на странице обзора приложения.
  4. Добавьте разрешение API AzureDatabricks :
    1. Перейдите в раздел разрешения API> и добавьте разрешение.
    2. Найдите и выберите AzureDatabricks.
    3. Включите user_impersonation и нажмите кнопку "Добавить разрешения".
    4. Нажмите кнопку "Предоставить согласие администратора" (требуются права администратора).

Поток кода авторизации

Установите SDK MSAL для Python

pip install msal

Сохраните следующий код следующим образом get-tokens.py:

from msal import PublicClientApplication
import sys

# Provide client ID and tenant ID as command-line arguments
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_interactive(scopes=scopes)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Запустите скрипт:

python get-tokens.py <client-id> <tenant-id>

Поток имени пользователя и пароля

Сохраните следующий код следующим образом get-tokens-user.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
username = sys.argv[3] if len(sys.argv) > 1 else '<username>'
password = sys.argv[4] if len(sys.argv) > 1 else '<password>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_username_password(
  username=username,
  password=password,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Запустите скрипт:

python get-tokens-user.py <client-id> <tenant-id> <username> <password>

Получение токенов для сервисных учетных записей

Субъекты-службы используют поток учетных данных клиента OAuth 2.0 и могут иметь другой контроль доступа, чем обычные пользователи.

Создайте сервисного принципала

Если у вас нет служебного принципала, создайте его через портал Azure или Azure CLI.

Портал Azure

  1. Войдите на портал Azure.
  2. При необходимости переключитесь на правильного арендатора с помощью Каталогов и подписок.
  3. Найдите и выберите Microsoft Entra ID.
  4. Нажмите кнопку +Добавить>регистрацию приложения.
  5. Введите имя и выберите "Учетные записи" только в этом каталоге организации (один клиент).
  6. Нажмите кнопку "Зарегистрировать".
  7. Скопируйте эти значения со страницы обзора
    • Идентификатор приложения (клиента)
    • Идентификатор каталога (клиента)
  8. Перейдите в раздел "Сертификаты и секреты>>, "Новый секрет клиента".
  9. Добавьте описание, задайте срок действия и нажмите кнопку "Добавить".
  10. Скопируйте и безопасно сохраните значение секрета клиента.

Azure CLI (Интерфейс командной строки для Azure)

Полные инструкции см. в статье "Создание субъекта-службы Azure с помощью Azure CLI ".

Создание маркера

Создайте маркер с помощью REST API или Azure CLI. Сначала соберите следующие сведения:

  • Идентификатор арендатора:Идентификатор каталога (арендатора) из Microsoft Entra ID
  • Идентификатор клиента:Идентификатор приложения (клиента) из идентификатора Microsoft Entra
  • Секрет клиента:Значение секрета клиента из идентификатора Microsoft Entra

Метод REST API

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \
-d 'client_id=<client-id>' \
-d 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d 'client_secret=<client-secret>'

Маркер доступа находится в access_token поле ответа.

Метод Azure CLI

  1. Получите идентификатор подписки Azure. Подробнее смотрите в разделе «Получение токенов для пользователей».

  2. Войдите с помощью учетной записи службы:

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. Задайте правильную подписку:

    az account set -s <subscription-id>
    
  4. Создайте маркер доступа:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

Использование токенов с API Databricks

После генерации токена используйте его с REST API Databricks.

Субъекты-службы в рабочей области

Если служебный принципал уже был добавлен в рабочую область с помощью API служебных принципалов или CLI Databricks:

Databricks CLI (интерфейс командной строки)

databricks clusters list -p <profile-name-with-token>

завиток

curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list

Субъекты-службы с ролью Azure

Если ваша учетная запись службы имеет роль Contributor или Owner в ресурсе рабочей области Azure, но еще не добавлена в рабочую область Azure Databricks:

  1. Получите токен управления для Azure Resource Manager:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/<tenant-id>/oauth2/token \
    -d 'client_id=<client-id>' \
    -d 'grant_type=client_credentials' \
    -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \
    -d 'client_secret=<client-secret>'
    
  2. Вызовите API Databricks, используя оба токена.

    curl -X GET \
    -H 'Authorization: Bearer <databricks-access-token>' \
    -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
    -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \
    https://<databricks-instance>/api/2.0/clusters/list
    

После первой аутентификации сервисный принципал становится администратором рабочей области.

Маркеры обновления

Если вы получили токен обновления с токеном доступа, используйте его для получения нового токена. Срок действия токенов доступа Microsoft Entra ID истекает через 60–90 минут по умолчанию.

Сохраните следующий код следующим образом refresh-tokens.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
refresh_token = sys.argv[3] if len(sys.argv) > 1 else '<refresh-token>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_refresh_token(
  refresh_token=refresh_token,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"\nNew access token:\n{result['access_token']}")
  print(f"\nNew refresh token:\n{result['refresh_token']}")

Запустите скрипт:

python refresh-tokens.py <client-id> <tenant-id> <refresh-token>

Устранение неполадок токена

В этом разделе описаны распространенные ошибки маркеров и способы проверки маркеров доступа.

Не удалось получить токен с именем пользователя и паролем

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: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (идентификатор ресурса Databricks)
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: идентификатор клиента рабочей области
  • nbf/exp: текущее время находится между этими значениями
  • unique_name: Пользователь существует в рабочей области

Проверьте подпись с помощью общедоступных сертификатов из конечных точек 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])}")

Декодирование с помощью проверки подписи:

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'

def get_public_key_for_token(kid):
  response = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration').json()
  pubkeys = requests.get(response['jwks_uri']).json()['keys']

  for key in pubkeys:
    if key['kid'] == kid:
      cert_str = PEMSTART + str(key['x5c'][0]) + PEMEND
      cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
      return cert_obj.public_key()

def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  decoded = jwt.decode(access_token, key=public_key, algorithms='RS256',
                      audience='2ff814a6-3304-4ab8-85cb-cd0e6f879c1d')
  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Используйте интерактивные декодеры JWT, такие как jwt.ms или jwt.io для нечувствительных маркеров.