Я пытаюсь вызвать API-интерфейс REST Azure из своих функций Azure с помощью PowerShell.Это нормально, когда я использую MSI с кодом ниже:
Write-Output "PowerShell Timer trigger function executed at:$(get-date)";
# Get an access token for the MSI
Write-Output "Endpoint: [$($env:MSI_ENDPOINT)]"
$apiVersion = "2017-09-01"
$resourceURI = "https://management.azure.com/"
$tokenAuthURI = $env:MSI_ENDPOINT + "?resource=$resourceURI&api-version=$apiVersion"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"Secret" = "$env:MSI_SECRET"} -Uri $tokenAuthURI
$ArmToken = $tokenResponse.access_token
$uri = "https://management.azure.com/subscriptions?api-version=2016-06-01"
$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}
$response = Invoke-RestMethod @params
$subscriptionId = $response.value.subscriptionId
# GET method: each querystring parameter is its own variable
if ($req_query_name)
{
$name = $req_query_name
}
$uri = "https://management.azure.com/subscriptions/" + $subscriptionId + "/resourcegroups?api-version=2018-02-01"
$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}
$response = Invoke-RestMethod @params | ConvertTo-Json
Out-File -Encoding Ascii -FilePath $res -inputObject $response
Теперь моя цель будет состоять в том, чтобы аутентифицировать пользователей и использовать эту аутентификацию для вызова REST API, таким образом, только элементы моих пользователей будутполучено.
Я активировал аутентификацию для своих функций: Активировать аутентификацию
Аутентификация
Конфиг
Я заменяю свой код на это, чтобы отобразить переменные:
Write-Output "PowerShell Timer trigger function executed at:$(get-date)";
$Result = Get-Variable | ConvertTo-Json
Затем я вызываю свои функции, при первом вызове мне предлагается разрешить ему «подключиться и просмотреть свой профиль»
Разрешить аутентификацию
В результате выполнения я получаю переменную "REQ_HEADERS_X-MS-TOKEN-AAD-ID-TOKEN" с токеном.
Token
Затем я пытаюсь повторно использовать этот токен для аутентификации моего вызова API REST:
Write-Output "PowerShell Timer trigger function executed at:$(get-date)"
$Result = Get-Variable -Name "REQ_HEADERS_X-MS-TOKEN-AAD-ID-TOKEN" | ConvertTo-Json | ConvertFrom-Json
$ARMToken = $Result.Value
$uri = "https://management.azure.com/subscriptions?api-version=2016-06-01"
$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}
$response = Invoke-RestMethod @params
Out-File -encoding Ascii -FilePath $res -inputObject $response
$response
Когда я вызываю свою функцию, я получаю это сообщение об ошибке:
2018-06-04T09:53:55.476 [Info] Function started (Id=a9e8c744-8f29-4516-95ad-7218b60790ec)
2018-06-04T09:53:56.711 [Info] PowerShell Timer trigger function executed at:06/04/2018 09:53:56
2018-06-04T09:53:57.499 [Error] Invoke-RestMethod : {"error":{"code":"InvalidAuthenticationTokenAudience","message":"The access token has been obtained from wrong audience or resource 'b46e2246-b8b5-4b33-897e-4702b6ddb868'. It should exactly match (including forward slash) with one of the allowed audiences 'https://management.core.windows.net/','https://management.azure.com/'."}}
at run.ps1: line 18
+ Invoke-RestMethod
+ _________________
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
2018-06-04T09:53:57.608 [Error] Exception while executing function: Functions.HttpTriggerPowerShell1. Microsoft.Azure.WebJobs.Script: PowerShell script error. Microsoft.PowerShell.Commands.Utility: The remote server returned an error: (401) Unauthorized.
2018-06-04T09:53:57.655 [Error] Function completed (Failure, Id=a9e8c744-8f29-4516-95ad-7218b60790ec, Duration=2167ms)
У кого-то есть идея, как повторно использовать токен для вызоваREST API с использованием аутентификации пользователя в функциях Azure?