首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Amazon销售合作伙伴API -签名请求(ruby实现)

Amazon销售合作伙伴API -签名请求(ruby实现)
EN

Stack Overflow用户
提问于 2021-01-11 15:25:37
回答 2查看 1.5K关注 0票数 3

在亚马逊销售合作伙伴API之后,我得到了LWA access token。但是,我在向REST提出请求时遇到了阻塞。

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

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

代码语言:javascript
复制
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'],
})

雷伯斯

代码语言:javascript
复制
{"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 4::签名人

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-03 15:16:56

对于任何无意中发现这一点的人:

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

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

如果使用有效值填充x-amz-access-token,但仍收到以下错误:

代码语言:javascript
复制
{
    "message": "Access to requested resource is denied.",
    "code": "Unauthorized",
    "details": "Access token is missing in the request header."
}

...then,您可能会遇到这个问题。

您可以通过重载Net:HTTPHeader.capitalize来绕过这个问题,如下所示:

代码语言:javascript
复制
module Net::HTTPHeader
  def capitalize(name)
    name
  end
  private :capitalize
end

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

票数 1
EN

Stack Overflow用户

发布于 2021-05-26 13:38:15

“请求头中缺少访问令牌”听起来好像您的x访问令牌有问题。你是这样取回的吗?client.rb#L40

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65669679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档