CosmosDB REST API获取文档时Auth Token授权失败求助
看起来你遇到的核心问题是生成授权令牌时的resourceLink参数错误,同时还存在请求日期不一致的问题,咱们一步步拆解解决:
1. 错误根源:ResourceLink与服务器期望不匹配
从错误信息里能看到,服务器用来校验签名的payload是:
'get\ndocs\ndbs/vacancies/colls/items\nthu, 18 jan 2018 14:31:43 gmt\n\n'
但你调用GenerateAuthToken时传入的resourceLink是"dbs/vacancies/colls/items/docs"——这里多了末尾的/docs。
在CosmosDB的授权规则里:
- ResourceLink指的是你要操作的父资源路径(这里是集合的路径:
dbs/vacancies/colls/items) - ResourceType才是你要操作的具体资源类型(这里是
docs,对应获取文档的操作)
请求URL里需要加/docs来指定获取集合下的文档,但生成签名时的resourceLink只需要到集合层级就够了。
2. 正确的授权令牌生成调用
你需要把GenerateAuthToken的第三个参数修改为集合路径,去掉末尾的/docs:
GenerateAuthToken("GET", "docs", "dbs/vacancies/colls/items", "masterkey", "master", "1.0");
3. 确保x-ms-date完全一致
另外注意,错误信息里服务器用的日期是thu, 18 jan 2018 14:31:43 gmt,但你请求头里的x-ms-date是thu, 18 jan 2018 10:53:23 gmt——这两个日期必须完全相同,包括格式(比如月份小写、逗号后加空格、GMT大写等)。生成令牌时用的日期必须和请求头里的x-ms-date严格一致,否则签名校验肯定失败。
4. 确认请求URL和请求头正确性
你的请求URL是没问题的:https://mycosmosdbaccount.documents.azure.com/dbs/vacancies/colls/items/docs
请求头要确保:
x-ms-version:2017-02-22(版本兼容,无需调整)Accept:application/json- 用修改后的参数重新生成的Authorization令牌
x-ms-date与生成令牌时使用的日期完全一致
按照这个修改后,应该就能顺利通过授权获取到集合里的文档了。
内容的提问来源于stack exchange,提问作者JurgenW

