Как исправить ошибку «401 Несанкционированный» в PUT Invoke-RestMethod (попытка заменить хранимую процедуру) - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь управлять ресурсами CosmosDB с помощью REST API и PowerShell. Мой код работает нормально, когда я использую GET и POST, но когда я пытаюсь заменить существующий объект, используя PUT, я получаю ошибку 401.

Мой код регистрирует хранимую процедуру, когда она не существует, и должен обновлять ее, когда SP уже существует.

Поэтому, когда я создаю новый SP, я использую следующие переменные:

$Verb = "POST"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType"

получить заголовок авторизации:

...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime

и затем вызов метода REST:

$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime} 
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body

Он прекрасно работает и создает то, что должен. И когда мне нужно заменить существующий объект (SP в моем случае), я изменяю переменные следующим образом:

$Verb = "PUT"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$ItemName = "SP_Name"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType/$ItemName"

генерировать заголовок аутентификации, как в случае с POST (отличается только глагол):

...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime
...

и метод invoke REST с новым URI (который теперь включает имя SP, которое будет изменено):

$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime} 
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body

Что бросает меня 401 Unauthorized, поэтому кажется, что заголовок аутентификации неверен. Не могу понять, что я должен изменить там.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Таким образом, ключ должен был изменить переменные следующим образом:

$ResourceType = "sprocs"
$ItemName = "SP_Name"
$ResourceLink = "dbs/$DBName/colls/$CollName/$ResourceType/$ItemName"

и затем сгенерировать заголовок аутентификации.Т.е. переменная ссылки на ресурс должна содержать полный путь к заменяемому объекту.

0 голосов
/ 03 апреля 2019

Отсюда похоже, что ресурс или значение ресурса, который вы пытаетесь изменить, не поддерживает действие PUT.Вы можете подтвердить вручную;

https://docs.microsoft.com/en-us/rest/api/cosmos-db/

или перейдя к;

https://resources.azure.com/

...