#azure #storage #azure-blob-storage #azure-java-sdk #azure-sas
#azure #Хранение #azure-blob-хранилище #azure-java-sdk #azure-sas
Вопрос:
Следующий код выдает исключение в последней строке:
// Create a BlobServiceClient object which will be used to create a container client
System.out.println(String.format("Connection String %s", connectStr));
blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();
// Get a user delegation key for the Blob service that's valid for seven days.
// You can use the key to generate any number of shared access signatures over the lifetime of the key.
keyStart = OffsetDateTime.now();
keyExpiry = OffsetDateTime.now().plusHours(7);
error -> userDelegationKey = blobServiceClient.getUserDelegationKey(keyStart, keyExpiry);
Исключение:
</Message><AuthenticationErrorDetail>Only authentication scheme Bearer is supported</AuthenticationErrorDetail></Error>"
Caused by: com.azure.storage.blob.models.BlobStorageException: Status code 403, "<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:d375b3bf-b01e-0044-1191-9c75a8000000
Я попытался адаптировать .СЕТЕВОЕ руководство по Java, но пока безуспешно.
Кажется, эта ошибка связана с вызовами REST API, есть идеи?
Ответ №1:
Итак, после многих попыток использовать ключи делегирования пользователя с использованием строки подключения учетной записи хранилища не работает. Мне пришлось зарегистрировать приложение и добавить новые переменные среды приложения. Наконец, проверьте правильность разрешения на панели управления IAM.
В моем случае я использую Azure с Spring,
- Добавлены только следующие зависимости:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.8.0</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.1.2</version>
</dependency>
- Создайте / зарегистрируйте приложение в Azure
- Создайте секрет клиента приложения с сертификатами и секретами.
- Храните идентификатор приложения-клиента, идентификатор клиента и секрет клиента в переменных среды, т.Е. на macos:
export AZURE_CLIENT_ID="xxxxxxx"
launchctl setenv AZURE_CLIENT_ID $AZURE_CLIENT_ID
export AZURE_TENANT_ID="xxxxxxx"
launchctl setenv AZURE_TENANT_ID $AZURE_TENANT_ID
export AZURE_CLIENT_SECRET="xxxxxxx"
launchctl setenv AZURE_CLIENT_SECRET $AZURE_CLIENT_SECRET
-
добавьте правильные назначения ролей
Storage Blob Data Contributor
для пользователя и приложения для учетной записи хранилища. смотрите это -
Теперь вы можете использовать следующий код для генерации ключа делегирования пользователя и примера контейнера SAS:
String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", "accountName");
// Create a BlobServiceClient object which will be used to create a container client
blobServiceClient = new BlobServiceClientBuilder().endpoint(endpoint)
.credential(new DefaultAzureCredentialBuilder().build()).buildClient();
// Get a user delegation key for the Blob service that's valid for seven days.
// You can use the key to generate any number of shared access signatures over the lifetime of the key.
keyStart = OffsetDateTime.now();
keyExpiry = OffsetDateTime.now().plusDays(7);
userDelegationKey = blobServiceClient.getUserDelegationKey(keyStart, keyExpiry);
BlobContainerSasPermission blobContainerSas = new BlobContainerSasPermission();
blobContainerSas.setReadPermission(true);
BlobServiceSasSignatureValues blobServiceSasSignatureValues = new BlobServiceSasSignatureValues(keyExpiry,
blobContainerSas);
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient("containerName");
if (!blobContainerClient.exists())
blobContainerClient.create();
String sas = blobContainerClient
.generateUserDelegationSas(blobServiceSasSignatureValues, userDelegationKey);
Надеюсь, это поможет кому-нибудь еще!