如何解决调用Amazon SP-API的问题,即使具有有效的令牌和签名,该API也会始终返回未经授权

问题描述

我仔细阅读了的使用指南,以进行设置以调用新的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);

解决方法

如果您的 sp 应用正在审核中,您也会收到此错误,让我发疯!

,

在我们的情况下,我们必须向我们定义为进行API调用的用户显式添加IAM策略。请查看下面的链接,并确认您调用API的用户已为其分配了策略:

https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md#step-3-create-an-iam-policy

不知何故,我们两次进行了逐步设置,而错过了添加此显式策略的步骤。最初,我认为是按照说明将其添加为“内联”,但这似乎行不通。

,

如果您遵循SP-API指南,则创建了一个角色(这是您的应用程序向其注册的IAM ARN)和一个用户,该用户有权承担该角色进行API调用。

但是,指南尚不清楚的一件事是您不能直接使用该用户的凭据进行API调用。您必须首先使用用户的凭据(AMAZON_ACCESS_KEY_ID / AMAZON_ACCESS_SECRET)调用STS API的AssumeRole method,然后它将返回根据角色授权的临时凭据。在签署请求时使用那些临时凭据。

[][][4][][],[][][][][],[][][][][] 还将返回会话令牌,您必须在API调用中将其包含在名为AssumeRole的标头中。有关X-Amz-Security-Token的简要说明,请参见https://docs.aws.amazon.com/STS/latest/APIReference/CommonParameters.html

,

我不认为是重复问题,购买解决方案可能适用:https://stackoverflow.com/a/66860192/1034622