如何解决调用 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 SP-API PHP 库 [关闭]

关于amazon亚马逊开发人员资料申请,amazon亚马逊销售合作伙伴 API,amazon亚马逊SP-API申请,amazon亚马逊Selling Partner API申请详细指导

Amazon SP-API文档看着累?那就看这里!

销售合作伙伴 API Amazon 400 错误请求

亚马逊卖家中心 - SP-API - 创建提要文档 - InvalidInput