Маркер 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

person Sergey    schedule 25.11.2019    source источник


Ответы (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

Тестовое задание:

введите здесь описание изображения

person Joy Wang    schedule 26.11.2019
comment
Что ж, догадался) Спасибо огромное! - person Sergey; 29.11.2019