【问题标题】:Amazon Selling Partner API - signed request (ruby implementation)Amazon Selling Partner API - 签名请求(ruby 实施)
【发布时间】:2021-01-11 15:25:37
【问题描述】:

按照亚马逊销售合作伙伴 API 文档,我获得了LWA access token。 但是,我在向 REST API 发出请求时被阻止了。

https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md#connecting-to-the-selling-partner-api

我尝试使用aws-sdk-signer 创建签名请求

access_token = 'LWA access token'

signer = Aws::Sigv4::Signer.new(
  access_key_id: 'my access id',
  region: 'us-east-1',
  secret_access_key: 'my access key,
  service: 'execute-api',
)

signature = signer.sign_request(
  http_method: 'GET',
  url: 'https://sellingpartnerapi-na.amazon.com/orders/v0/orders',
  headers: {
    'host' => 'sellingpartnerapi-na.amazon.com',
    'user_agent' => 'test (Language=Ruby)',
    'x-amz-access-token' => access_token
  })

response = HTTParty.send(:get, 'https://sellingpartnerapi-na.amazon.com/orders/v0/orders', headers: {
  'host' => signature.headers['host'],
  'user_agent' => 'test (Language=Ruby)',
  'x-amz-access-token' => access_token,
  'x-amz-content-sha256' => signature.headers['x-amz-content-sha256'],
  'x-amz-date' => signature.headers['x-amz-date'],
  'Authorization' => signature.headers['authorization'],
})

回复

{"errors"=>[{"message"=>"Access to requested resource is denied.", "code"=>"Unauthorized", "details"=>"Access token is missing in the request header."}]}

看起来我没有正确签署 LWA 访问令牌,但我不知道发生了什么,因为这是一个新 API,并且没有太多实现,尤其是在 ruby​​ 中。

谁能指点一下?

更新:我关注了 Singer 文档 https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Sigv4/Signer.html

Aws::Sigv4::Signer

【问题讨论】:

  • signature.headers 得到什么?这个散列的值可以明文访问吗?我认为'x-amz-content-sha256' 中的签名应该是代表整个请求值的散列结果。
  • signature.headers 返回纯文本字符串,参考文档docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Sigv4/… 在示例中,'x-amz-content-sha256'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  • 嗯,查看文档以查看标题应该是什么样子。例如授权标头应如下所示:Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7docs.aws.amazon.com/general/latest/gr/…github.com/amzn/selling-partner-api-docs/blob/main/guides/…
  • 感谢您的回复!我在这里发送了Authoriazation 'Authorization' => signature.headers['authorization'],看起来像AWS4-HMAC-SHA256 Credential=AKIAUDJT3KUQIRIKGDW6/20210112/us-east-1/execute-api/aws4_request, SignedHeaders=host;user_agent;x-amz-access-token;x-amz-content-sha256;x-amz-date, Signature=bfdcceb3f4a8f33120b59a0f0d07cf62456fb5f88d5823cc739e9516c7ef6728
  • 实际上,我对x-amz-content-sha256 感到困惑,因为文档没有提到这个标题。但是,AWS 签名者默认自动签署此标头。

标签: ruby amazon-product-api


【解决方案1】:

对于任何偶然发现此问题的人:

您的问题可能源于 HTTParty(或其他 HTTP 客户端 gem)在幕后使用 Ruby 的 Net::HTTPHeader

Net::HTTPHeader 在发送请求之前将所有请求标头大写,x-amz-access-token 标头区分大小写。

如果您使用有效值填充 x-amz-access-token 并且仍然收到以下错误:

{
    "message": "Access to requested resource is denied.",
    "code": "Unauthorized",
    "details": "Access token is missing in the request header."
}

...那么您很可能会遇到这个问题。

您可以通过重载Net:HTTPHeader.capitalize 来绕过它,如下所示:

module Net::HTTPHeader
  def capitalize(name)
    name
  end
  private :capitalize
end

另请参阅:https://github.com/amzn/selling-partner-api-docs/issues/292#issuecomment-759904882

【讨论】:

    【解决方案2】:

    “请求标头中缺少访问令牌”听起来您的 x-amz-access-token 有问题。你是这样检索的吗? https://github.com/ericcj/amz_sp_api/blob/main/lib/sp_api_client.rb#L40

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 2021-02-03
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2022-01-09
      • 2022-08-03
      • 2021-12-01
      • 2022-08-03
      相关资源
      最近更新 更多