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

PHP调用CosmosDB Emulator REST API:URL语法差异致授权错误求助

解决CosmosDB Emulator使用用户自定义ID调用REST API的Unauthorized错误

你遇到的问题核心是AzureDocumentDB-PHP库基于旧版MSDN文档开发,默认只适配用系统生成_rid的路径格式,当改用用户自定义ID的路径时,库生成授权签名的payload和实际请求不匹配,直接触发了Unauthorized错误。

先拆解下错误信息里的关键线索:

{"code":"Unauthorized", "message":"The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'get\ndbs\ndbs/db_test\nthu, 25 jan 2018 10:28:30 gmt\n\n'\r\n ActivityId: a43be1a0-c35b-4438-bb83-522204d3f589, Microsoft.Azure.Documents.Common/1.19.102.5"}

服务器验证时用的payload只到了数据库层级dbs/db_test,但你请求的是单文档,完整路径应该包含集合和文档的用户ID:dbs/db_test/colls/{你的集合ID}/docs/{你的文档ID},这说明库在构建签名时没有把后续路径拼接进去。

下面是具体的解决方案:

方案1:修改AzureDocumentDB-PHP库的签名生成逻辑

既然库是基于旧版文档开发的,我们可以调整它处理资源路径的代码:

  • 找到库中负责生成授权令牌的核心文件(通常是DocumentClient.php里的generateAuthorizationToken方法)
  • 检查它拼接resourceLink的逻辑:当传入用户自定义ID的路径时,要确保完整的资源路径(dbs/{db-id}/colls/{coll-id}/docs/{doc-id})被直接传入签名函数,而不是分段处理数据库、集合、文档的路径
  • 举个例子,如果原来的代码是分段拼接资源路径,改成直接接收完整路径后再生成签名即可

方案2:手动构建请求和授权签名(绕过库的限制)

如果不想修改库的代码,可以手动构造符合learn.microsoft.com要求的请求:

  1. 构造正确的请求URL:
    https://localhost:8081/dbs/{你的数据库ID}/colls/{你的集合ID}/docs/{你的文档ID}
    
  2. 生成符合规则的授权令牌:
    • 构造签名payload字符串,格式严格遵循:
      get\ndocs\ndbs/{你的数据库ID}/colls/{你的集合ID}/docs/{你的文档ID}\n{GMT格式的当前时间}\n\n
      
      注意:verb是get,resourceType是docs,时间必须是RFC1123格式的GMT时间(比如Thu, 25 Jan 2018 10:28:30 GMT)
    • 用CosmosDB Emulator的主密钥对这个payload做HMAC-SHA256加密,再进行Base64编码
    • 构造Authorization请求头:
      type=master&ver=1.0&sig={Base64编码后的签名}
      
  3. 发送GET请求时,带上x-ms-date(和签名里的时间完全一致)、x-ms-version: 2017-02-22这些必要的请求头

额外注意事项

  • 确保CosmosDB Emulator是最新版本,避免旧版本对用户ID路径的兼容问题
  • 检查x-ms-date的时区必须是GMT,和签名里的时间不能有任何偏差
  • 确认用户自定义的数据库、集合、文档ID没有拼写错误

内容的提问来源于stack exchange,提问作者Velu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:15:01