Как исправить ошибку «401 несанкционированный» в методе PUT Invoke-RestMethod (попытка заменить хранимую процедуру)

#azure #azure-cosmosdb #azure-powershell

#azure #azure-cosmosdb #azure-powershell

Вопрос:

Я пытаюсь управлять ресурсами 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"
  

сгенерируйте заголовок auth точно так же, как в случае с 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 , поэтому кажется, что заголовок auth неверен. Не могу понять, что я должен там изменить.

Ответ №1:

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

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

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

https://resources.azure.com/

Комментарии:

1. На самом деле, это должно: Заменить хранимую процедуру и, похоже, делает.

Ответ №2:

Итак, ключом было изменить переменные таким образом:

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

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