0

我正在尝试发出 Amazon Selling Partner API Restricted Data Token 请求,但收到错误消息并附有解释:

'GET/tokens/2021-03-01/restrictedDataToken
host:sellingpartnerapi-eu.amazon.com
x-amz-access-token:Atza|IwEBIKl_cR0g8tkcs-XR_6aoWu_4kPbRlBnW07MUCQkS5_I3nA716HJxM_A7TIjXb3oUkBMjw7Mqxq1kGsbTnajJvgBT2yisnu6AEuZvtEpSgCIih9S9-0NrnLWQT5IUlWuvzUiXmogfKZghVoT65b3_WWV29mxLyhL1yK61NylCrFQCa5vwzT4m2Tuoo6dIrE77Qf79cRzwpiLbaLP8fiM3XgqMVSiDt246BBYWkI-Rg0t2FatoQHseE0sYp4SPfWY4c-AZEtSFzejVPcQRTsLIgm1SWmwIojO6b-mpAOIW2MMj00Vy7AAs6WzrS2z9PqW2ecrKoH-p7BNnRuIE672ofmEc
x-amz-date:20211201T141644Zhost;
x-amz-access-token;
x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
'The String-to-Sign should have been'
AWS4-HMAC-SHA25620211201T141644Z20211201/eu-west-1/execute-api/aws4_requestda72cd0eaab649d1219a0316d8a19360f10c2d9bb10fe716bc828fac408d2647'

最后两行让我感到困惑,我的问题是关于它们:

'The String-to-Sign should have been'
    AWS4-HMAC-SHA25620211201T141644Z20211201/eu-west-1/execute-api/aws4_requestda72cd0eaab649d1219a0316d8a19360f10c2d9bb10fe716bc828fac408d2647'

我试图理解所提供的String-to-Sign内容,我的理解是亚马逊在此错误消息中返回完全混乱。奇怪的是:

  1. 亚马逊调用AWS4-HMAC-SHA25620211201T141644Z20211201/eu-west-1/execute-api/aws4_requestda72cd0eaab649d1219a0316d8a19360f10c2d9bb10fe716bc828fac408d2647但它已经包含签名(da72cd0eaab649d1219a0316d8a19360f10c2d9bb10fe716bc828fac408d2647在这种情况下);

  2. 这个字符串不是通常的格式header-name:value,例如我的字符串签名是非常清晰的结构:

    Authorization=AWS4-HMAC-SHA256 Credential=<PRIVATE_INFORMATION>/20211201/eu-west-1/execute-api/aws4_request, SignedHeaders=host;x-amz-access-token;x-amz-date, Signature=aaab78223b9f6ba2ce7466bc134b1976dcb28efd0b60c80dec6884a

  3. 亚马逊String-to-sign不包含凭证/AWSKey,因此任何人都可以制作。

  4. AmazonString-to-sign不包含有关签名标头的信息,显然 Amazon 在 RDT 请求中假定了确切的格式(标头的数量和类型),与灵活性的奇怪偏差。

所以,我的理解是,String-to-Sign亚马逊返回的示例是错误的,而不是我可以用来纠正我的服务的可靠提示。我已经String-to-Sign在许多成功的 Amazon Selling Parnter API 请求(不需要 RDT)中使用了我的,并且 Amazon 本身在说(在https://github.com/amzn/ sell-partner-api-docs/issues/639 中):

向使用 LWA 令牌签名的 Tokens API 发出请求(构造普通 SP API 请求的方式)。将受限 API 路径和方法添加为请求正文参数的一部分。

正是我所做的:我只是更改了主机名并将受限资源的 JSON 序列化描述添加到此请求的正文中。签名过程没有变化。但亚马逊不接受这一点。

4

1 回答 1

0

我在我的问题中混淆了我的请求的两种表示。Amazon 使用请求的规范字符串和从规范字符串计算的 stringtosign 报告请求的特殊表示。

问题中的图片AWS - 真正的规范请求是什么?值千言万语。亚马逊首先使用 LWA 访问数据对请求进行签名,该数据标识发出请求的程序/服务。这个签名只是添加了 header x-amz-access-token。此标头(AWS 访问令牌签名)与原始标头一起形成最终请求,通过对标头、参数进行排序,最终请求成为规范请求(图中的步骤 1)。然后执行图片的所有剩余步骤。

在我的问题中,从亚马逊响应中读取规范字符串和 stringtosign,我试图将这两个字符串与我的请求的标头进行比较。当然,这不能直接比较。

我应该调试/跟踪我的代码,看看我自己的程序如何计算规范字符串和 stringtosign。

如果我使用的是 Selling Parnter API 文档中由 swagger 生成的 C# 代码,那么生成规范字符串和 stringtosign 的代码在过程中AWSSigV4Signer.cs procedure public IRestRequest Sign(IRestRequest request, string host)。在这种情况下,AWSSigV4 签名只是为最终请求添加额外的标头。所以 - 我必须追溯AWSSigV4Signer.Sign程序以获取规范字符串和 stringtosign 以与亚马逊响应进行比较。

当然,最后这些字符串对不能逐字节比较,因为规范字符串包含由 LWS 访问数据计算的 x-amz-access-token 并且这些是特定于程序的,我的理解是亚马逊包含一些通用的x-amz-access-token 响应中的数据,这就是为什么无法在完整值级别进行精确比较的原因。

于 2021-12-02T10:31:42.410 回答