使用PowerShell调用CosmosDB Rest API执行PATCH操作时遇未授权错误
问题根源
从错误信息可明确:服务器生成签名时使用的payload包含完整的文档资源路径(dbs/testsnow/colls/test/docs/RITM009953466),但你的代码中resourceLink仅设置为集合路径(dbs/testsnow/colls/test),导致签名不匹配,触发Unauthorized错误。
修复步骤
核心是将resourceLink修改为目标文档的完整资源路径,确保签名生成的payload与服务器期望的完全一致。
修改后的完整代码
$key = "<MASTERKEY>" $verb = "PATCH" $resourceType = "docs" # 修复:改为完整的文档资源路径 $resourceLink = "dbs/testsnow/colls/test/docs/<docid>" $dateTime = [DateTime]::UtcNow.ToString("r") $keyType = "master" $tokenVersion = "1.0" $hmacSha256 = New-Object System.Security.Cryptography.HMACSHA256 $hmacSha256.Key = [System.Convert]::FromBase64String($key) $payLoad = "$($verb.ToLowerInvariant())`n$($resourceType.ToLowerInvariant())`n$resourceLink`n$($dateTime.ToLowerInvariant())`n`n" $hashPayLoad = $hmacSha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($payLoad)) $signature = [System.Convert]::ToBase64String($hashPayLoad); $x = [System.Web.HttpUtility]::UrlEncode("type=$keyType&ver=$tokenVersion&sig=$signature") $header = @{ authorization = $x "x-ms-version" = "2018-12-31" "x-ms-date" = $dateTime "Content-Type" = "application/json_patch+json" "x-ms-documentdb-partitionkey" = '["open"]' } $document = @{ "operations" = @(@{"op"="Replace";"path"="/state";"value"="testname"}) } | ConvertTo-Json $queryUri = "https://<URL>/dbs/testsnow/colls/test/docs/<docid>" $result = Invoke-RestMethod -Method $verb -Uri $queryUri -Headers $header -Body $document
关键说明
resourceLink必须与请求URI中对应的资源路径完全一致:针对单个文档操作时,路径格式为dbs/<数据库名>/colls/<容器名>/docs/<文档ID>- 确保
x-ms-date的值与签名生成时使用的$dateTime完全相同,时间必须为UTC时间 - 分区键
x-ms-documentdb-partitionkey需与目标文档的分区键值匹配
内容的提问来源于stack exchange,提问作者Chethiya Amarasinghe
相关产品推荐
相关产品推荐

