如何在适用于 Java 的 Amazon SP Api 中使用受限数据令牌 (RDT)

Gig*_*iga 6 java api amazon-web-services

我正在使用Amazon SP api 和生成的 Java SDK。我的测试应用程序正在检查订单和送货地址。据亚马逊称,这应该是一项受限操作。但目前,我可以在不使用RDT的情况下获取信息。我尝试使用 RDT,如下所示,但它不起作用。

// Build orders-api
OrdersV0Api ordersApi = new OrdersV0Api.Builder()
              .awsAuthenticationCredentials(awsAuthenticationCredentials)
              .lwaAuthorizationCredentials(lwaAuthorizationCredentials)
              .awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
              .endpoint("https://sellingpartnerapi-eu.amazon.com")
              .build();
    
List<String> orderStatuses = new ArrayList<String>();
orderStatuses.add(OrderStatusEnum.UNSHIPPED.getValue());
    
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -3);
    
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String tmp = sdf.format(new Date());
    
try {
    // Get orders
    GetOrdersResponse respOrders = ordersApi.getOrders(Marketplaces.getAllMarketplaces(), sdf.format(cal.getTime()), null, null, null, orderStatuses, null, null, null, null, 100, null, null, null);
    OrderList orders = respOrders.getPayload().getOrders();
    Order ord = orders.get(0);
        
    // Restricted Data Token
    RestrictedResource rr = new RestrictedResource();
    rr.setMethod(MethodEnum.GET);
    rr.setPath("/orders/v0/orders/" + ord.getAmazonOrderId() + "/address");

    CreateRestrictedDataTokenRequest req = new CreateRestrictedDataTokenRequest();
    req.addRestrictedResourcesItem(rr);
    
    TokensApi tokensApi = new TokensApi.Builder()
              .awsAuthenticationCredentials(awsAuthenticationCredentials)
              .lwaAuthorizationCredentials(lwaAuthorizationCredentials)
              .awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
              .endpoint("https://sellingpartnerapi-eu.amazon.com")
              .build(); 

    CreateRestrictedDataTokenResponse resp3 = tokensApi.createRestrictedDataToken(req);
    String token = resp3.getRestrictedDataToken();

    // Add token to Header ?
    ordersApi.getApiClient().addDefaultHeader("x-amz-access-token", token); 
        
    // Get delivery adress
    GetOrderAddressResponse respAdress = ordersApi.getOrderAddress(ord.getAmazonOrderId());
    Address adr = respAdress.getPayload().getShippingAddress();
        
} catch (ApiException e) {
        e.printStackTrace();
} 
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,收到此错误: “message”:“我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

似乎仅设置 x-amz-access-token 并不是添加 RDP 的正确操作。但我也看不到ordersApi 或ordersApi.getApiClient 上的任何其他操作似乎是正确的。而且我也不清楚,为什么当我完全不使用 tokens-api 时它还能工作。

loa*_*d02 3

根据 RDT 令牌流程和 Amazon SP-API Java SDK,我想指出这个官方示例工作流程

不幸的是,亚马逊提供的 ApiClient 的使用 ordersApi.getApiClient().addDefaultHeader("x-amz-access-token", token); 被破坏了,需要一些自定义调整才能使其工作。

如果当 x-amz-access-token 丢失时请求仅由 LwaAuthorizationSigner 签名,请为我修复流程。比较此PR

像这样更改 ApiClient.java:

-        request = lwaAuthorizationSigner.sign(request);
+        if (!defaultHeaderMap.containsKey("x-amz-access-token")) {
+            request = lwaAuthorizationSigner.sign(request);
+        }
Run Code Online (Sandbox Code Playgroud)