You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell调用CosmosDB Rest API执行PATCH操作时遇未授权错误

CosmosDB REST API PATCH操作Unauthorized错误解决

问题根源

从错误信息可明确:服务器生成签名时使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:54:54