DocumentDB UnauthorizedException:"The MAC signature found in the HTTP request is not the same as the computed signature."
DocumentDB UnauthorizedException: "The MAC signature found in the HTTP request is not the same as the computed signature."
从 DocumentDB 请求文档时,我偶尔会遇到 UnauthorizedException。这个问题看起来类似于,所以我认为问题没有解决。
Microsoft.Azure.Documents.UnauthorizedException :
Message: "The MAC signature found in the HTTP request is not the same as the computed signature.
Request URI: rntbd://db5prdddc01-docdb-1.documents.azure.com:14245/apps/35e0fabb-e03e-48d4-90ad-7b91b63c0153/services/9bb95f7b-9ad6-4128-a66a-de68279d5124/partitions/44a24d42-a85c-42cc-98c4-fc8a733245ac/replicas/130953283548138839p/
更新:问题已解决,特别感谢 Andrew Liu!
很高兴听到您不再遇到此问题:)
在这里发帖是为了其他人的利益...
如果您看到这样的问题,则表示应用程序和数据库之间的身份验证 header 不匹配。这可能是多种原因造成的...包括不正确的身份验证密钥、系统时钟不同步或身份验证 header 的生成方式存在问题。
First-Party DocumentDB SDK
如果您使用的是 DocumentDB 的第一方客户端 SDK 之一 - 很可能是授权密钥不正确或系统时钟问题...
如果这些看起来不错,那就是 DocumentDB 端存在错误。如果您遇到问题 - 请联系我 (askcosmosdb {at} microsoft.com) 并提供一些 activity ID + 时间戳 + 堆栈跟踪,我可以帮助您调查问题。
休息API
header 组合起来相当棘手...这里有一些构建身份验证的技巧 header:
所有参数(动词、资源类型、日期等)在签名前必须小写,使用 id-based 路由时除外。
对于id-based路由,您需要签署资源的完整路径(例如dbs/MyDatabase/colls/MyCollection/docs/MyDocument
);不仅仅是资源的 ID(例如 MyDocument
)。请注意,路径是 case-sensitive... 而所有其他参数都应小写。
密钥是Base64编码的。
待签名的文本应为utf-8编码。
生成的身份验证令牌是 SHA256 HMAC,应进行 Base64 编码。
与所有 HTTP header 一样,签名(包括签名令牌)应进行 URL 编码(例如 +
需要编码为 %2B
).
完整文档和示例代码,参见:https://msdn.microsoft.com/en-US/library/azure/dn783368.aspx
检查静态客户端方法。有可能是您错误地使用了带有只读密钥的客户端。
尝试使用只读密钥写入会引发该异常。
我在使用主连接字符串时遇到了同样的问题,当我将连接字符串更改为辅助连接字符串时,它对我有用。
从 DocumentDB 请求文档时,我偶尔会遇到 UnauthorizedException。这个问题看起来类似于
Microsoft.Azure.Documents.UnauthorizedException :
Message: "The MAC signature found in the HTTP request is not the same as the computed signature.
Request URI: rntbd://db5prdddc01-docdb-1.documents.azure.com:14245/apps/35e0fabb-e03e-48d4-90ad-7b91b63c0153/services/9bb95f7b-9ad6-4128-a66a-de68279d5124/partitions/44a24d42-a85c-42cc-98c4-fc8a733245ac/replicas/130953283548138839p/
更新:问题已解决,特别感谢 Andrew Liu!
很高兴听到您不再遇到此问题:)
在这里发帖是为了其他人的利益...
如果您看到这样的问题,则表示应用程序和数据库之间的身份验证 header 不匹配。这可能是多种原因造成的...包括不正确的身份验证密钥、系统时钟不同步或身份验证 header 的生成方式存在问题。
First-Party DocumentDB SDK
如果您使用的是 DocumentDB 的第一方客户端 SDK 之一 - 很可能是授权密钥不正确或系统时钟问题...
如果这些看起来不错,那就是 DocumentDB 端存在错误。如果您遇到问题 - 请联系我 (askcosmosdb {at} microsoft.com) 并提供一些 activity ID + 时间戳 + 堆栈跟踪,我可以帮助您调查问题。
休息API
header 组合起来相当棘手...这里有一些构建身份验证的技巧 header:
所有参数(动词、资源类型、日期等)在签名前必须小写,使用 id-based 路由时除外。
对于id-based路由,您需要签署资源的完整路径(例如
dbs/MyDatabase/colls/MyCollection/docs/MyDocument
);不仅仅是资源的 ID(例如MyDocument
)。请注意,路径是 case-sensitive... 而所有其他参数都应小写。密钥是Base64编码的。
待签名的文本应为utf-8编码。
生成的身份验证令牌是 SHA256 HMAC,应进行 Base64 编码。
与所有 HTTP header 一样,签名(包括签名令牌)应进行 URL 编码(例如
+
需要编码为%2B
).
完整文档和示例代码,参见:https://msdn.microsoft.com/en-US/library/azure/dn783368.aspx
检查静态客户端方法。有可能是您错误地使用了带有只读密钥的客户端。
尝试使用只读密钥写入会引发该异常。
我在使用主连接字符串时遇到了同样的问题,当我将连接字符串更改为辅助连接字符串时,它对我有用。