Токен 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
Контрольная работа: