【发布时间】:2021-01-11 15:25:37
【问题描述】:
按照亚马逊销售合作伙伴 API 文档,我获得了LWA access token。
但是,我在向 REST 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
【问题讨论】:
-
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 签名者默认自动签署此标头。