如何修复PUT Invoke-RestMethod中的“401 Unauthorized”错误(试图替换存储过程)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复PUT Invoke-RestMethod中的“401 Unauthorized”错误(试图替换存储过程)相关的知识,希望对你有一定的参考价值。

我正在尝试使用REST API和PowerShell管理CosmosDB资源。当我使用GET和POST时,我的代码工作正常,但是当我尝试使用PUT替换现有对象时,我得到401错误。

我的代码在不存在时注册存储过程,并且应该在SP已存在时更新它。

所以当我创建一个新的SP时,我使用以下变量:

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

获取auth标头:

...
$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
...

以及使用新URI调用REST方法(现在包括要更改的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标头是不对的。无法弄清楚我应该改变什么。

答案

从这里看起来,您尝试更改的资源或资源中的值不支持PUT操作。你可以手动确认;

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

或者去;

https://resources.azure.com/

另一答案

所以关键是以这种方式改变变量:

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

然后生成auth标头。即资源链接变量必须包含替换对象的完整路径。

以上是关于如何修复PUT Invoke-RestMethod中的“401 Unauthorized”错误(试图替换存储过程)的主要内容,如果未能解决你的问题,请参考以下文章

Invoke-RestMethod:发送到标头时找不到请求的身份验证数据

无法使用 Invoke-RestMethod 更新工作项历史记录

Invoke-RESTMethod PowerShell

格式化 Invoke-RestMethod 或 ConvertFrom-Json 返回的 [pscustomobject] 实例

用于排队构建的Invoke-RestMethod的Body需要包含什么? [重复]

Powershell Invoke-Restmethod不能将生成的Authtoken用作变量