Получение маркеров идентификатора Microsoft Entra для пользователей с помощью MSAL
Внимание
В этой статье описывается, как вручную создать маркеры идентификатора Microsoft Entra с помощью библиотеки проверки подлинности Майкрософт (MSAL).
Databricks не рекомендует создавать маркеры идентификатора Microsoft Entra для пользователей Azure Databricks вручную. Это связано с тем, что каждый маркер идентификатора Microsoft Entra является коротким сроком действия, обычно истекает в течение одного часа. После этого необходимо вручную создать заменяющий маркер идентификатора Microsoft Entra. Вместо этого используйте один из участвующих средств или пакетов SDK, реализующих стандарт унифицированной проверки подлинности клиента Databricks. Эти средства и пакеты SDK автоматически создают и заменяют истекшие маркеры идентификатора Microsoft Entra ID для вас, используя проверку подлинности Azure CLI.
Управляемые субъекты-службы Azure Databricks управляются непосредственно в Azure Databricks. Управляемые субъекты-службы идентификатора Microsoft Entra управляются в идентификаторе Microsoft Entra, для которого требуются дополнительные разрешения. Databricks рекомендует использовать управляемые субъекты-службы Azure Databricks для большинства вариантов использования. Однако Databricks рекомендует использовать управляемые субъекты-службы Идентификатора Microsoft Entra в случаях, когда необходимо выполнить проверку подлинности с помощью Azure Databricks и других ресурсов Azure одновременно.
Сведения о создании управляемого субъекта-службы Azure Databricks вместо управляемого субъекта-службы идентификатора Microsoft Entra см. в статье "Управление субъектами-службами".
Библиотеку проверки подлинности Майкрософт (MSAL) можно использовать для получения маркеров доступа к идентификатору Microsoft Entra. В этой статье рассматриваются основные принципы использования библиотеки MSAL и необходимые действия со стороны пользователя на основе примеров Python.
Примечание.
MSAL заменяет библиотеку проверки подлинности идентификатора Microsoft Entra (ADAL). Все средства поддержки и разработки Майкрософт для ADAL, включая обновления для системы безопасности, стали недоступны с 30 июня 2022 г. См. статью о переводе приложений на Библиотеку проверки подлинности Майкрософт (MSAL).
Совет
Возможно, вы хотите попробовать использовать Azure CLI вместо MSAL, чтобы получить маркеры идентификатора Microsoft Entra для пользователей, так как использование Azure CLI включает меньше шагов. Сведения о получении маркеров идентификатора Microsoft Entra для пользователей с помощью Azure CLI.
Вы также можете определить субъект-службу в идентификаторе Microsoft Entra и получить маркер доступа к идентификатору Microsoft Entra для субъекта-службы, а не для пользователя. См. сведения о получении маркеров идентификатора Microsoft Entra для субъектов-служб.
Настройка приложения на портале Azure
Зарегистрируйте приложение с помощью конечной точки идентификатора Microsoft Entra в портал Azure. Кроме того, можно использовать приложение идентификатора Microsoft Entra, которое уже зарегистрировано. Дополнительные сведения см. в статье Регистрация приложения с помощью портала Azure.
Войдите на портал Azure.
Примечание.
Используемый портал отличается в зависимости от того, работает ли ваше приложение идентификатора Microsoft Entra в общедоступном облаке Azure или в национальном или независимом облаке. Дополнительные сведения см. на странице национальных облаков.
Если у вас есть доступ к нескольким арендаторам, подпискам или каталогам, щелкните значок Каталоги + подписки (каталог с фильтром) в верхнем меню, чтобы перейти к каталогу, в котором необходимо зарегистрировать приложение.
Найдите и выберите Microsoft Entra ID.
В разделе Управление выберите Регистрация приложений > Создать регистрацию.
Введите имя приложения
В разделе Поддерживаемые типы учетных записей выберите Учетные записи только в этом каталоге организации (один арендатор).
В разделе URI перенаправления (необязательно) для выбора платформы выберите общедоступный клиент или собственный (мобильный и классический) и введите универсальный код ресурса (URI перенаправления). В следующем примере URI перенаправления имеет значение
http://localhost
.Щелкните Зарегистрировать.
На странице Обзор приложения в разделе Основные компоненты скопируйте следующие значения:
- Application (client) ID (Идентификатор приложения (клиент))
- Идентификатор каталога (клиент)
- В разделе URI перенаправления — URI перенаправления общедоступного клиента, введенный ранее в этой процедуре.
Добавьте AzureDatabricks к необходимым разрешениям зарегистрированного приложения. Для выполнения этого шага необходимо быть пользователем с правами администратора. Если во время выполнения этого действия возникла проблема, связанная с разрешениями, обратитесь за помощью к администратору.
На странице Обзор приложения на вкладке Начало работы щелкните Просмотреть разрешения API.
Щелкните Добавить разрешение.
В области Запрос разрешений API откройте вкладку Интерфейсы API, используемые моей организацией, выполните поиск по запросу AzureDatabricks и выберите его.
Установите флажок user_impersonation и нажмите кнопку Добавить разрешения.
Выберите Предоставить согласие администратора для ###, а затем — Да. Для выполнения этого действия необходимо быть пользователем с правами администратора или иметь права на предоставление согласия для приложения. Если вы не видите параметр Предоставить согласие администратора для ### или пропустите это действие, вам потребуется представить согласие с помощью потока кода авторизации (интерактивного) при первом использовании приложения. После этого можно воспользоваться методом Поток "имя пользователя — пароль" (программный).
В приложение можно добавить дополнительных пользователей. Дополнительные сведения см. в статье "Назначение учетной записи пользователя корпоративному приложению для портал Azure инструкций или назначение пользователей и групп приложению в идентификаторе Microsoft Entra ID (ранее Azure Active Directory) для инструкций PowerShell. Пользователь не сможет получить маркер без необходимых разрешений.
Получение маркера доступа идентификатора Microsoft Entra
Чтобы получить маркер доступа к идентификатору Microsoft Entra, можно использовать любой из следующих вариантов:
Необходимо использовать поток кода авторизации (интерактивный), чтобы получить маркер доступа к идентификатору Microsoft Entra, если:
- В идентификаторе Microsoft Entra включена двухфакторная проверка подлинности.
- Федеративная проверка подлинности включена в идентификаторе Microsoft Entra.
- Вы не предоставили зарегистрированному приложению согласие во время регистрации приложения.
Если у вас есть центр входа с помощью имени пользователя и пароля, вы можете использовать поток доступа к идентификатору пользователя (программное) для получения маркера доступа к идентификатору Microsoft Entra.
Поток кода авторизации (интерактивный)
Существует два шага для получения маркера доступа идентификатора Microsoft Entra с помощью потока кода авторизации.
- Запросите код авторизации, который запускает окно браузера и запрашивает имя пользователя Azure для входа. После того как пользователь успешно войдет в систему, будет возвращен код авторизации.
- Используйте код авторизации для получения маркера доступа идентификатора Microsoft Entra. В зависимости от используемого подхода маркер обновления также можно вернуть одновременно и использовать для обновления маркера доступа идентификатора Microsoft Entra.
Для выполнения этих двух этапов можно использовать веб-браузер и curl. Для этого вы используете веб-браузер для получения кода авторизации, а затем используете код авторизации и curl
получает маркер доступа к идентификатору Microsoft Entra ID. В рамках этого метода маркер обновления не создается.
Другой подход заключается в использовании библиотеки MSAL Python. Для этого нужно запустить скрипт, который с помощью веб-браузера получает код авторизации, а затем использует его для получения маркера доступа и обновления.
Оба этих подхода предполагают, что вы уже вошли в Azure. Если вход не выполнен, в веб-браузере будет предложено это сделать.
Получение маркеров идентификатора Microsoft Entra с помощью веб-браузера и curl
Соберите следующие сведения:
Параметр Описание Идентификатор клиента Идентификатор каталога (клиента) для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra, в разделе "Настройка приложения в портал Azure". Client ID Идентификатор приложения (клиента) для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra. URI-адрес перенаправления Соответствующие URI перенаправления для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra (например, http://localhost
). Ответы проверки подлинности, к которым добавляется код авторизации, направляются на этот универсальный код ресурса (URI).Чтобы получить код авторизации, в веб-браузере перейдите по указанному ниже URL-адресу. Замените поля в этом образце URL-адреса соответствующим образом. Обратите внимание, что URL-адрес должен быть отправлен в виде одной строки; разрывы строк добавлены к этому адресу для удобства чтения. Дополнительные сведения см. в разделе Запрос кода авторизации.
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?client_id=<client-id> &response_type=code &redirect_uri=<redirect-uri> &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=<state>
Замена:
<tenant-id>
с идентификатором арендатора зарегистрированного приложения.<client-id>
с идентификатором клиента зарегистрированного приложения.<redirect-uri>
URI перенаправления зарегистрированного приложения. Этот URI должен быть в формате кодировки URL-адреса (со знаками процента). Например, адресуhttp://localhost
соответствует значениеhttp%3A%2F%2Flocalhost
.<state>
произвольным числом или определенной закодированной информацией. Для надежной проверки целостности обмена данными это значение состояния должно совпадать со значением в возвращенном URL-адресе далее в этой процедуре.
Не изменяйте значение параметра
scope
. Он представляет собой программный идентификатор для Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) вместе с областью по умолчанию (/.default
, в кодировке URL-адреса в виде%2f.default
).Например:
https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/authorize?client_id=12a34b56-789c-0d12-e3fa-b456789c0123 &response_type=code &redirect_uri=http%3A%2F%2Flocalhost &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=12345
Вставьте URL-адрес в виде одной строки в веб-браузер и при появлении запроса войдите в Azure.
Код авторизации находится в поле
code
в возвращенном URL-адресе. Сохраните код авторизации в безопасном месте. Кроме того, убедитесь, что значение поляstate
совпадает с указанным ранее в этой процедуре.Полный возвращенный URL-адрес будет выглядеть примерно так (полное значение поля
code
для краткости сокращено здесь до0.ASkAIj...RxgFhSAA
):http://localhost/?code=0.ASkAIj...RxgFhSAA&state=12345&session_state=c44574d5-38ba-4f93-b2a3-a830db8e8cdf
Используйте код авторизации вместе с
curl
маркером доступа идентификатора Microsoft Entra.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 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=<authorization-code>' \ -d 'redirect_uri=<redirect-uri>' \ -d 'grant_type=authorization_code' \ -d 'state=<state>'
Замена:
<tenant-id>
с идентификатором арендатора зарегистрированного приложения.<client-id>
с идентификатором клиента зарегистрированного приложения.<authorization-code>
кодом авторизации.<redirect-uri>
URI перенаправления зарегистрированного приложения. Этот URI должен быть в формате кодировки URL-адреса (со знаками процента). Например, адресуhttp://localhost
соответствует значениеhttp%3A%2F%2Flocalhost
.<state>
произвольным числом или определенной закодированной информацией. Для надежной проверки целостности обмена данными это значение состояния должно совпадать со значением в полезных данных ответа далее в этой процедуре.
Не изменяйте значение параметра
scope
. Он представляет собой программный идентификатор для Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) вместе с областью по умолчанию (/.default
, в кодировке URL-адреса в виде%2f.default
).Например:
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/token \ -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=0.ASkAIj...RxgFhSAA' \ -d 'redirect_uri=http%3A%2F%2Flocalhost' \ -d 'grant_type=authorization_code' \ -d 'state=12345'
Маркер идентификатора Microsoft Entra находится в
access_token
значении в результате вызова. Обязательно убедитесь, что значениеstate
совпадает с тем, которое вы указали ранее в этой процедуре.
Получение маркеров идентификатора Microsoft Entra с помощью библиотеки MSAL Python
Соберите следующие сведения:
Параметр Описание Идентификатор клиента Идентификатор каталога (клиента) для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra, в разделе "Настройка приложения в портал Azure". Client ID Идентификатор приложения (клиента) для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra. В этой процедуре предполагается, что вы установили
http://localhost
URI перенаправления для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra.Установите пакет SDK для MSAL Python на локальном компьютере, выполнив команду
pip install msal
.Сохраните приведенный ниже код в файле
get-tokens.py
на локальном компьютере.# Given the client ID and tenant ID for an app registered in Azure, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scopes = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 3): print("Usage: get-tokens.py <client ID> <tenant ID>") exit(1) # If the registered app's client ID and tenant ID are provided as # command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_interactive( scopes = scopes ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Выполните одно из следующих действий:
- В приведенном выше коде замените
<client-id>
идентификатором клиента зарегистрированного приложения, а<tenant-id>
— идентификатором арендатора зарегистрированного приложения, а затем запустите скрипт, напримерpython get-tokens.py
. - Во время выполнения скрипта укажите идентификаторы клиента и арендатора зарегистрированного приложения, например
python get-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de
.
- В приведенном выше коде замените
Если в веб-браузере появится соответствующий запрос, войдите в Azure.
Маркеры доступа и обновления microsoft Entra ID печатаются в выходных данных.
Поток "имя пользователя — пароль" (программный)
Если у вас есть полномочия для входа с помощью имени пользователя и пароля, соберите следующие сведения:
Параметр Описание Идентификатор клиента Идентификатор каталога (клиента) для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra, в разделе "Настройка приложения в портал Azure". Client ID Идентификатор приложения (клиента) для реального приложения, зарегистрированного в идентификаторе Microsoft Entra. Имя пользователя и пароль Имя пользователя (то есть адрес электронной почты, указываемый при входе на портал Azure) и пароль пользователя в арендаторе. В этой процедуре предполагается, что вы установили
http://localhost
URI перенаправления для связанного приложения, зарегистрированного в идентификаторе Microsoft Entra.Установите пакет SDK для MSAL Python на локальном компьютере, выполнив команду
pip install msal
.Сохраните приведенный ниже код в файле
get-tokens-for-user.py
на локальном компьютере.# Given the client ID and tenant ID for an app registered in Azure, # along with an Azure username and password, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # along with the Azure username and password, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' username = '<username>' password = '<password>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 5): print("Usage: get-tokens-for-user.py <client ID> <tenant ID> <username> <password>") exit(1) # If the registered app's client ID and tenant ID along with the # Azure username and password are provided as command-line variables, # set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] username = sys.argv[3] password = sys.argv[4] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_username_password( username = username, password = password, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Выполните одно из следующих действий:
- В приведенном выше коде замените
<client-id>
идентификатором клиента зарегистрированного приложения,<tenant-id>
— идентификатором арендатора зарегистрированного приложения,<username>
— именем пользователя, а<password>
— паролем, а затем запустите скрипт, напримерpython get-tokens-for-user.py
. - Во время выполнения скрипта укажите идентификаторы клиента и арендатора зарегистрированного приложения, имя пользователя и пароль, например
python get-tokens-for-user.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de [email protected] "MyPa55w&rd!"
. Если аргумент командной строки содержит специальные символы, его следует заключить в кавычки.
- В приведенном выше коде замените
Маркеры доступа и обновления microsoft Entra ID печатаются в терминале.
Использование маркера доступа идентификатора Microsoft Entra для доступа к REST API Databricks
В этом разделе описывается, как использовать маркер доступа идентификатора Microsoft Entra для вызова REST API Databricks. В следующих примерах замените <access-token>
маркер <databricks-instance>
доступа идентификатора Microsoft Entra и URL-адресом рабочей области развертывания Azure Databricks.
Пример на Python
В этом примере объясняется, как вывести список кластеров в рабочей области Azure Databricks.
import requests
import json
databricks_instance = '<databricks-instance>'
api_version = '/api/2.0'
api_command = '/clusters/list'
url = f"https://{databricks_instance}{api_version}{api_command}"
access_token = '<access-token>'
response = requests.get(
url = url,
headers = { 'Authorization': "Bearer " + access_token}
)
print(json.dumps(json.loads(response.text), indent = 2))
Примечание.
Если вы являетесь пользователем без административных прав и хотите войти в систему как пользователь с правами администратора, необходимо указать заголовок X-Databricks-Azure-Workspace-Resource-Id
в дополнение к заголовку 'Authorization' : 'Bearer '
, а кроме того, нужна роль участника или владельца для ресурса рабочей области в Azure. Значение X-Databricks-Azure-Workspace-Resource-Id
создается следующим образом:
# ...
subscription = '<azure-subscription-id>'
resource_group = '<azure-resource-group-name>'
workspace = '<databricks-workspace-name-in-azure>'
db_resource_id = '/subscriptions/%s/resourcegroups/%s/providers/microsoft.databricks/workspaces/%s' % (
subscription,
resource_group,
workspace
)
# ...
headers = {
'Authorization': "Bearer " + access_token,
'X-Databricks-Azure-Workspace-Resource-Id': db_resource_id
}
# ...
Чтобы получить сведения о подписке, ресурсе и рабочей области в Azure, см. раздел Открытие ресурсов. Чтобы открыть целевой ресурс, можно найти его по типу службы Azure Databricks и любой другой информации в Azure, которая известна вам о целевой рабочей области Azure Databricks.
Пример curl
curl -X GET \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Обновление маркера доступа идентификатора Microsoft Entra
Если вы получаете маркер обновления вместе с маркером доступа идентификатора Microsoft Entra, вы можете использовать маркер обновления для получения нового маркера. По умолчанию время существования маркеров доступа идентификатора Microsoft Entra — это случайный период времени от 60 до 90 минут (в среднем 75 минут). Вы можете настроить время существования маркеров доступа к идентификатору Microsoft Entra с помощью методов в настраиваемых времени существования маркеров в идентификаторе Microsoft Entra (ранее Azure Active Directory).
В следующем примере показано, как использовать библиотеку MSAL Python вместе с маркером обновления для получения нового маркера.
Сохраните приведенный ниже код в файле
refresh-tokens.py
на локальном компьютере.# Given the client ID and tenant ID for an app registered in Azure, # along with a refresh token, provide a new <ms-entra-id> access token and # refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID, tenant ID, # and refresh token here, or you can provide them as command-line # arguments to this script. client_id = '<client-id>' tenant_id = '<refresh-token' refresh_token = '<refresh-token>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 4): print("Usage: refresh-tokens.py <client ID> <tenant ID> <refresh token>") exit(1) # If the registered app's client ID, tenant ID, and refresh token are # provided as command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] refresh_token = sys.argv[3] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_refresh_token( refresh_token = refresh_token, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("\nNew access token:\n") print(acquire_tokens_result['access_token']) print("\nNew refresh token:\n") print(acquire_tokens_result['refresh_token'])
Выполните одно из следующих действий:
- В приведенном выше коде замените
<client-id>
идентификатором клиента зарегистрированного приложения,<tenant-id>
— идентификатором арендатора зарегистрированного приложения, а<refresh-token>
— маркером обновления, а затем запустите скрипт, напримерpython get-tokens-for-user.py
. - Во время выполнения скрипта укажите идентификаторы клиента и арендатора зарегистрированного приложения, а также маркер обновления, например
python refresh-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de "0.ASkAIj...huE84ALg"
. Если аргумент командной строки содержит специальные символы, его следует заключить в кавычки.
- В приведенном выше коде замените
Новые маркеры доступа и обновления идентификатора Microsoft Entra печатаются в терминале.