Azure sdk для Java Как настроить ключ делегирования пользователя и подписи общей аутентификации SAS

#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,

  1. Добавлены только следующие зависимости:
         <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>
  
  1. Создайте / зарегистрируйте приложение в Azure
  2. Создайте секрет клиента приложения с сертификатами и секретами.
  3. Храните идентификатор приложения-клиента, идентификатор клиента и секрет клиента в переменных среды, т.Е. на 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
  
  1. добавьте правильные назначения ролей Storage Blob Data Contributor для пользователя и приложения для учетной записи хранилища. смотрите это

  2. Теперь вы можете использовать следующий код для генерации ключа делегирования пользователя и примера контейнера 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);
  

Надеюсь, это поможет кому-нибудь еще!