Я создал регистрацию приложения в Azure Active Directory и добавил разрешение API для доступа к Azure хранилищу.
Я также создал назначение роли пользователя и приложения следующим образом:
New-AzureADUserAppRoleAssignment -ObjectId $user.ObjectId -PrincipalId $user.ObjectId -ResourceId $servicePrincipal.ObjectId -Id ([Guid]::Empty)
Я предоставил пользователю роль «Участник хранилища BLOB-данных» на портале Azure. Затем я получил токен доступа от этого метода:
public void acquireToken(android.app.Activity activity,
String resource,
String clientId,
@Nullable String redirectUri,
@Nullable String loginHint,
@NonNull com.microsoft.aad.adal.AuthenticationCallback<com.microsoft.aad.adal.AuthenticationResult> callback)
clientId - это приложение с правами доступа к хранилищу. URI перенаправления - это тот, который я установил для приложения на портале. Я попробовал два идентификатора ресурса. Я отправляю этот токен как заголовок Authentication: Bearer.
Возвращает ошибку "Audience validation failed. Audience did not match"
, если идентификатор ресурса, который я передаю в acquToken, равен «https: // <> .blob.core. windows. net / "
Возвращает ошибку "The specified container does not exist"
, если идентификатор ресурса равен" https://storage.azure.com/ ".
Я использую Retrofit для выполнения операции PUT.
public static final String CONTENT_TYPE_TEXT_PLAIN_HEADER = "Content-Type: text/plain; charset=UTF-8";
public static final String X_MS_VERSION = "x-ms-version: 2017-11-09";
public static final String X_MS_DATE = "x-ms-date";
public static final String X_MS_BLOB_CONTENT = "x-ms-blob-content-disposition: attachment; filename=\"fname.ext\"";
public static final String X_MS_BLOB_TYPE = "x-ms-blob-type: BlockBlob";
public static final String X_MS_META_M1 = "x-ms-meta-m1: v1";
public static final String X_MS_META_M2 = "x-ms-meta-m2: v2";
@Headers({CONTENT_TYPE_TEXT_PLAIN_HEADER,
X_MS_VERSION,
X_MS_BLOB_CONTENT,
X_MS_BLOB_TYPE,
X_MS_META_M1, X_MS_META_M2})
@PUT("/blob1")
Call<Void> putBlob(@Header(AUTHORIZATION) String bearerToken,
@Header(X_MS_DATE) String date,
@Body String putBody);