Кэширование токенов/учетных записей для DeviceCodeCredentials.

Вопрос или проблема

У меня есть программа на Python, которая отправляет конвейеры в Azure ML. Этот код обычно выполняется на безголовых Linux ВМ и выполняет аутентификацию в Azure с помощью потока DeviceCodeCredentials. Я хочу кэшировать эти учетные данные, чтобы иметь возможность запускать этот скрипт много раз и снова выполнять аутентификацию только время от времени (например, раз в час).

Согласно документации, TokenCachePersistenceOptions должен решить эту проблему, однако, похоже, что он не имеет эффекта, кроме записи бесполезного файла. Вот как выглядит мой код:

from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential, TokenCachePersistenceOptions

from .constants import AML_SUBSCRIPTION_ID, AML_RESOURCE_GROUP, AML_WORKSPACE


cache_path = os.path.expanduser("~/.azure/msal_token_cache.json")

token_cache_options = TokenCachePersistenceOptions(name=cache_path, allow_unencrypted_storage=True)
credential = DeviceCodeCredential(token_cache_persistence_options=token_cache_options)

client = MLClient(
    credential=credential,
    subscription_id=AML_SUBSCRIPTION_ID,
    resource_group_name=AML_RESOURCE_GROUP,
    workspace_name=AML_WORKSPACE,
)

# делаем что-то бесполезное, требующее запросов
jobs = client.jobs.list()
_ = [j.name for j in jobs]

Я ожидал, что если я запущу этот скрипт, аутентифицируюсь, а затем запущу его второй раз, он не запросит аутентификацию снова. Однако он это делает.

Я пробовал разные области полномочий учетных данных, а также создавал и вручную сериализовал и десериализовал разнообразные “токены” и “записи авторизации”, передавая эти токены и записи авторизации в методы, которые могут или не могут на самом деле что-то с ними делать, но ничего не срабатывает. Я исследовал документацию для Python SDK. Я обратился в поддержку Azure, но они оказались бесполезными.

Есть ли у кого-нибудь предложения?

Ответ или решение

Чтобы реализовать кэширование учетных данных, используемых с DeviceCodeCredentials для вашего Python-приложения, которое запускает пайплайны в Azure ML, необходимо убедиться, что токены сохраняются и корректно загружаются при повторных запусках скрипта. Возможно, вы столкнулись с недочетами в настройке и использовании TokenCachePersistenceOptions. Я приведу пример, как это сделать правильно.

Вот улучшенный вариант вашего кода:

import os
import json
from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential, TokenCachePersistenceOptions
from azure.identity import AuthenticationRecord

# Константы для подключения к Azure ML
AML_SUBSCRIPTION_ID = 'ваш_id_подписки'
AML_RESOURCE_GROUP = 'ваша_группа_ресурсов'
AML_WORKSPACE = 'ваш_рабочий_пространство'

# Путь к кэшу токенов
cache_path = os.path.expanduser("~/.azure/msal_token_cache.json")

# Опции кэширования токена
token_cache_options = TokenCachePersistenceOptions(name=cache_path, allow_unencrypted_storage=True)

# Создание экземпляра DeviceCodeCredential с кэшированием
credential = DeviceCodeCredential(token_cache_persistence_options=token_cache_options)

# Проверка наличия существующих учетных данных
try:
    # Попытка получить сохраненные учетные данные
    auth_record = credential.get_cached_token()  # Получить кэшированный токен
    if auth_record is None:
        # Если кэшированный токен отсутствует, выполняется процесс аутентификации
        print("Требуется аутентификация...")
        credential.authenticate()
except Exception as e:
    print(f"Ошибка при получении токена: {e}")

# Создание клиента MLClient
client = MLClient(
    credential=credential,
    subscription_id=AML_SUBSCRIPTION_ID,
    resource_group_name=AML_RESOURCE_GROUP,
    workspace_name=AML_WORKSPACE,
)

# Выполнение запроса к API для проверки работы клиента
try:
    jobs = client.jobs.list()
    job_names = [j.name for j in jobs]
    print("Список заданий:", job_names)
except Exception as e:
    print(f"Ошибка при получении списка заданий: {e}")

Объяснение происходящего:

  1. Кэширование токенов: TokenCachePersistenceOptions позволяет сохранять токен в файл и извлекать его в следующий раз, когда вы запустите скрипт. Убедитесь, что путь к файлу кэша правильный и у вашей программы есть права на его запись.

  2. Обработка существующих учетных данных: В коде предусмотрен этап проверки, есть ли уже кэшированные учетные данные (токен). Если их нет, выполняется процесс аутентификации. Это позволяет избежать повторной аутентификации, если токен действителен и доступен для использования.

  3. Обработка исключений: Оборачивая вызовы в блоки try-except, вы сможете увидеть, если что-то пойдет не так, что облегчит отладку.

Заключение:

С этим подходом ваш скрипт должен корректно кэшировать и использовать учетные данные в Azure ML без необходимости повторной аутентификации при каждом запуске. Если проблема все еще сохраняется, убедитесь, что у вас установлены последние версии библиотек Azure SDK для Python.

Оцените материал
Добавить комментарий

Капча загружается...