В настоящее время я работаю над веб-приложением на основе второго пилота. В рамках приложения пользователям необходимо войти в систему с помощью Azure Active Directory (AD). Приложение включает функцию Azure, считывающую данные в хранилище BLOB-объектов.
В настоящее время эта функция Azure выполняет аутентификацию в хранилище BLOB-объектов с использованием управляемого удостоверения в Python (с использованием пакета azure.identity и метода defaultAzureCredential()).
Однако я хочу изменить метод аутентификации для чтения из хранилища BLOB-объектов, чтобы использовать пользовательский токен (возможно, токен OAuth2?) вместо управляемого удостоверения. Пытаюсь найти подходящий пакет Python для использования такого токена для хранилища BLOB-объектов, поскольку в документации azure.identity не вижу никакой информации о чем-то подобном.
Есть ли способ аутентификации доступа к хранилищу BLOB-объектов в Python с помощью функции OAuth2?
До сих пор пробовали использовать управляемую идентификацию или добавить идентификатор entra поверх функции Azure, но это слишком громоздко, поскольку требует дополнительных шагов входа в систему для пользователей.
Обновлено: Добавление кода функции здесь по запросу (извините, если форматирование неправильное):
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
f"https://{account_name}.blob.core.windows.net", credential=credential
)
blob_client = blob_service_client.get_blob_client(
container=container_name, blob=blob_name
)
download_stream = BytesIO()
download_stream.write(blob_client.download_blob().readall())
download_stream.seek(0) # Reset the stream position
return func.HttpResponse(
download_stream.read(),
mimetype = "application/pdf",
headers = {"Content-Disposition": f"inline; filename = {blob_name}"},
)
Здесь я хочу изменить тип учетных данных: я хочу использовать токен OAuth2/что-то подобное и не уверен, что мне нужно изменить с точки зрения чтения из большого двоичного объекта. Спасибо!
@spinning_out_of_time, можешь поделиться своим кодом функции? используете ли вы триггер хранилища BLOB-объектов/привязку ввода/вывода?
Используйте метод InteractiveBrowserCredential
вместо DefaultAzureCredential
для аутентификации каждого пользователя.
Ниже приведенный код работал у меня.
Я читаю текстовый файл.
function_app.py
:
from io import BytesIO
import azure.functions as func
from azure.identity import InteractiveBrowserCredential, DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
app = func.FunctionApp()
@app.route(route = "http_trigger", auth_level=func.AuthLevel.ANONYMOUS, methods= ['get'])
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
account_name = "xxxxxxxxxxx"
container_name = "xxxxxxxxx"
blob_name = "upload.txt"
credential= InteractiveBrowserCredential()
blob_service_client = BlobServiceClient(
f"https://{account_name}.blob.core.windows.net", credential=credential
)
blob_client = blob_service_client.get_blob_client(
container=container_name, blob=blob_name
)
download_stream = BytesIO()
download_stream.write(blob_client.download_blob().readall())
download_stream.seek(0) # Reset the stream position
return func.HttpResponse(
download_stream.read(),
mimetype = "text/plain",
headers = {"Content-Disposition": f"inline; filename = {blob_name}"},
)
OUTPUT
:Аутентификация учетной записи пользователя.
Аутентификация завершена
Спасибо, это очень полезно — я думаю, что класс InteractiveBroswerCredential — это то, что я искал. Я мог бы спросить, знаете ли вы, можно ли пропустить этап входа в систему, передав учетные данные пользователя непосредственно в коде? Я знаю, что это не идеально с точки зрения безопасности, но это просто попытка. Еще раз спасибо за помощь в этом!
@spinning_out_of_time Можно использовать учетные данные пользователя, используя метод UsernamePasswordCredential
, который вам необходимо предоставить client id of a service pricipal
, username
и password
. Если MFA включен для аутентификации пользователей, будет выдана ошибка. MFA нельзя выполнить на основе кода, предоставив учетные данные. InteractiveBroswerCredential
по моему мнению лучший вариант.
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.