c# - 如何解决调用 Amazon SP-API 的问题,即使使用有效的 token 和签名,它也始终返回未经授权

标签 c# api integration amazon amazon-mws

我浏览了设置调用新 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/

相关文章:

c# - Encog神经网络隐藏层最佳神经元数量

android - 使用 Places API 时出现 "The provided API key is expired."错误

java - EJB 和 FLEX

rest - 在领域驱动设计中可以调用另一个限界上下文的应用程序服务吗?

c# - 如何将我的 Azure 站点启用为 https 而不是 http?

c# - 为什么我在使用线程的并发 HTTP 连接上受限

c# - GetTokenAsync 使用 auth0 在 ASP.NET Core 2.1 中返回 2 个受众

spring - 如何在不维护jsessionid的情况下在Spring Boot中保护RESTful API

python - 将目录上传到 pinata ipfs API

apache-camel - Camel 收件人列表 : How to prevent leaking of threads