我浏览了设置调用新 SP-API ( https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md ) 的指南,并在此过程中检查了所有 api 区域以授予访问权限(即订单、库存等)。我正在使用 Amazon 提供的 C# 库 ( https://github.com/amzn/selling-partner-api-models/tree/main/clients/sellingpartner-api-aa-csharp )。我成功获取访问 token 并成功签署请求,但总是收到以下错误:拒绝访问请求的资源。/未经授权,没有详细信息。 我正在尝试对 执行简单的访问/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 ARN)和一个有权代入该角色以进行 API 调用的用户。
但是,该指南不清楚的一件事是您不能直接使用该用户的凭据进行 API 调用。您必须先调用 STS API 的 AssumeRole method使用您的用户凭据 (AMAZON_ACCESS_KEY_ID/AMAZON_ACCESS_SECRET),它将返回针对角色授权的临时凭据。您在签署请求时使用这些临时凭证。AssumeRole
还将返回一个 session token ,您必须在 API 调用中将其包含在名为 X-Amz-Security-Token
的 header 中。 . X-Amz-Security-Token
的简要说明见 https://docs.aws.amazon.com/STS/latest/APIReference/CommonParameters.html
关于c# - 如何解决调用 Amazon SP-API 的问题,即使使用有效的 token 和签名,它也始终返回未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64468573/