如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此
Posted
技术标签:
【中文标题】如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此【英文标题】:How to fix issue calling Amazon SP-API, which always returns Unauthorized, even with valid Token and Signature 【发布时间】:2021-02-04 15:55:30 【问题描述】:我浏览了设置指南以调用新的 SP-API (https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md),并在此过程中检查了所有 api 区域以授予访问权限(即订单、库存等)。我正在使用 Amazon (https://github.com/amzn/selling-partner-api-models/tree/main/clients/sellingpartner-api-aa-csharp) 提供的 C# 库。我成功获得了访问令牌并成功签署了请求,但总是收到以下错误:访问请求的资源被拒绝。 / 未经授权,没有详细信息。 我正在尝试执行对 /orders/v0/orders 端点的简单获取。任何想法我做错了什么?任何帮助将不胜感激!
下面是我的代码:
private const string MARKETPLACE_ID = "ATVPDKIKX0DER";
var resource = $"/orders/v0/orders";
var client = new RestClient("https://sellingpartnerapi-na.amazon.com");
IRestRequest restRequest = new RestRequest(resource, Method.GET);
restRequest.AddParameter("MarketPlaceIds", MARKETPLACE_ID, ParameterType.QueryString);
restRequest.AddParameter("CreatedAfter", DateTime.UtcNow.AddDays(-5), ParameterType.QueryString);
var lwaAuthorizationCredentials = new LWAAuthorizationCredentials
ClientId = AMAZON_LWA_CLIENT_ID,
ClientSecret = AMAZON_LWA_CLIENT_SECRET,
RefreshToken = AMAZON_LWA_REFRESH_TOKEN,
Endpoint = new Uri("https://api.amazon.com/auth/o2/token")
;
restRequest = new LWAAuthorizationSigner(lwaAuthorizationCredentials).Sign(restRequest);
var awsAuthenticationCredentials = new AWSAuthenticationCredentials
AccessKeyId = AMAZON_ACCESS_KEY_ID,
SecretKey = AMAZON_ACCESS_SECRET,
Region = "us-east-1"
;
restRequest = new AWSSigV4Signer(awsAuthenticationCredentials).Sign(restRequest, client.BaseUrl.Host);
var response = client.Execute(restRequest);
【问题讨论】:
我遇到了同样的问题。您在这方面取得了进展吗? 不幸的是,没有。但是,我向他们的支持提交了一张票,据说它已升级给应该联系的首席工程师。如果我对此有任何解决方案,我一定会在此处发布详细信息。如果您也取得任何进展,请告诉我=) 有人更新了吗?我可以获取刷新令牌、检查签名、检查凭证,但仍然得到可怕的“我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法”。 嗨@david,你知道了吗?我也面临同样的问题,我的应用处于草稿模式。 嗨。我现在正在处理这个问题,我猜你错过了“授权”标题。我必须告诉亚马逊 SP-API 文档真的很烂,因为提供的签名者库实际上没有签署任何东西:它只是执行 LWA 授权以获取 AccessToken。明天我会写 Sign 流程代码——我猜——我会告诉你的。 【参考方案1】:如果您遵循 SP-API 指南,则您创建了一个角色(即您的应用注册的 IAM ARN)和一个有权代入该角色以进行 API 调用的用户。
但是,指南不清楚的一件事是您不能直接使用该用户的凭据进行 API 调用。您必须首先使用您的用户凭据 (AMAZON_ACCESS_KEY_ID/AMAZON_ACCESS_SECRET) 调用 STS API 的 AssumeRole method,它将返回针对角色授权的临时凭据。您在签署请求时使用那些临时凭证。
AssumeRole
还将返回一个会话令牌,您必须将其与 API 调用一起包含在名为 X-Amz-Security-Token
的标头中。有关X-Amz-Security-Token
的简要说明,请参阅https://docs.aws.amazon.com/STS/latest/APIReference/CommonParameters.html
【讨论】:
【参考方案2】:如果您的 sp 应用正在审核中,您也会收到此错误,让我抓狂!
【讨论】:
处于草稿状态是否适用? 是的,确实如此!这让人很困惑!【参考方案3】:如果你使用 c# 看看
https://github.com/abuzuhri/Amazon-SP-API-CSharp
AmazonConnection amazonConnection = new AmazonConnection(new AmazonCredential()
AccessKey = "AKIAXXXXXXXXXXXXXXX",
SecretKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
RoleArn = "arn:aws:iam::XXXXXXXXXXXXX:role/XXXXXXXXXXXX",
ClientId = "amzn1.application-XXX-client.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
ClientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
RefreshToken= "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
);
var orders= amazonConnection.Orders.ListOrders();
【讨论】:
您似乎添加了指向您自己的项目或您所属项目的链接。如果是这种情况,you must disclose your affiliation in the answer itself.。如果不披露此信息,您的帖子可能会被视为垃圾邮件。【参考方案4】:在我们的情况下,我们必须向我们定义为进行 API 调用的用户显式添加 IAM 策略。请查看下面的链接并确认您调用 API 的用户已分配给他们的策略:
https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md#step-3-create-an-iam-policy
不知何故,我们进行了两次分步设置,但错过了添加此显式策略。最初我相信它是按照指示添加“内联”的,但这似乎不起作用。
【讨论】:
【参考方案5】:我不认为是重复的问题,购买解决方案可能适用:https://***.com/a/66860192/1034622
【讨论】:
以上是关于如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Sp-Api createFeedDocument,无响应 (Node.js) / 和 InvalidInput-contentType 错误
关于amazon亚马逊开发人员资料申请,amazon亚马逊销售合作伙伴 API,amazon亚马逊SP-API申请,amazon亚马逊Selling Partner API申请详细指导