Токен OAuth для вызова REST API в Azure Data Lake Storage 2-го поколения с использованием субъекта-службы

Я работаю над приложением (одним из основных микросервисов), которое будет вызывать Azure ADLS Gen 2 для хранения файлов (в файловой системе) для дальнейшей обработки другими компонентами.

Я пытаюсь получить токен OAuth для целей аутентификации, вызывая конечную точку аутентификации Azure с использованием предварительно созданного субъекта-службы.

Код PowerShell, который я использую для создания субъекта-службы:

Add-AzAccount -Subscription <SUBSCRIPTION ID>
$sp = New-AzADServicePrincipal -DisplayName <PRINCIPAL NAME>
Sleep 20
New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $sp.ApplicationId
$sp.ApplicationId
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$UnsecureSecret  

Я использую значения $sp.ApplicationId как <идентификатор клиента приложения Azure AD> и $UnsecureSecret как <секрет клиента приложения Azure AD>.

Затем приложение Azure AD настраивается с разрешениями API:

Я добавил приложение Azure AD в качестве КОНТРИБЬЮТОРА ДАННЫХ BLOB-ДАННЫХ ХРАНЕНИЯ в колонку IAM учетной записи хранения.

Затем я собираюсь получить токен OAuth.
Ниже приведены звонки, которые я сделал с помощью Postman:

ПОЛУЧИТЬ

https://login.microsoftonline.com/<TENANT ID>/oauth2/token

Заголовки

Content-Type: application/x-www-form-urlencoded

Тело запроса

grant_type:client_credentials
client_id: <Azure AD application client ID>
client_secret: <Azure AD application client secret>
scope: https://storage.azure.com/.default

После этого звонка я могу получить успешный ответ:

{
    "token_type": "Bearer",  
    "expires_in": "3600",  
    "ext_expires_in": "3600",  
    "expires_on": "1574686915",  
    "not_before": "1574683015",  
    "resource": "00000002-0000-0000-c000-000000000000",  
    "access_token": "eyJ0eX<..>" . 
}

Затем я пытаюсь создать файловую систему, используя следующий запрос:

ПОЛОЖИТЬ

https://<STORAGE ACCOUNT NAME>.dfs.core.windows.net/<FILESYSTEM NAME>?resource=filesystem

Заголовки

Authorization: Bearer <JWT token>
x-ms-date: Mon, 25 Nov 2019 12:00:00 GMT
x-ms-version: 2019-02-02

И постоянно получаю следующую ошибку:

        {
            "error": {
                "code": "InvalidAuthenticationInfo",
                "message": "Server failed to authenticate the request.   
    Please refer to the information in the www-authenticate header.
\nRequestId:a6bf42d7-a01f-0006-1d88-a304da000000\nTime:2019-11-25T12:05:32.3049492Z"
            }
        }

Я пробовал разные прицелы, но это не помогает:

https://dfs.core.windows.net/.default
https://blob.core.windows.net/.default

1 ответ

Решение

Я могу воспроизвести вашу проблему, Contributor Роли RBAC достаточно, добавлять не нужно API permission, проблема была вызвана тем, как вы запрашиваете токен при использовании v1.0 конечная точка, вам нужно использовать resource: https://storage.azure.com/.

GET https://login.microsoftonline.com/<TENANT ID>/oauth2/token

grant_type:client_credentials
client_id: <Azure AD application client ID>
client_secret: <Azure AD application client secret>
resource: https://storage.azure.com/

Или вы можете изменить URL-адрес запроса на v2.0 конечная точка, он тоже будет работать.

GET https://login.microsoftonline.com/<TENANT ID>/oauth2/v2.0/token

grant_type:client_credentials
client_id: <Azure AD application client ID>
client_secret: <Azure AD application client secret>
scope: https://storage.azure.com/.default

Контрольная работа:

Другие вопросы по тегам