【问题标题】:Problem with LWA Token Exchange using Selling-Partner Java SDK使用 Selling-Partner Java SDK 的 LWA 令牌交换问题
【发布时间】:2021-01-25 14:05:32
【问题描述】:

我的代码

AWSAuthenticationCredentials awsAuthenticationCredentials = AWSAuthenticationCredentials.builder()
                .accessKeyId("XXXXXXXXXXXXXXX").secretKey("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
                .region("eu-west-1").build();
        
        AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider = AWSAuthenticationCredentialsProvider
                .builder().roleArn("XXXXXXXXXXXXX").roleSessionName("123123123")
                .build();



        LWAAuthorizationCredentials lwaAuthorizationCredentials = LWAAuthorizationCredentials.builder()
                .clientId("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
                .clientSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
                .endpoint("https://api.amazon.com/auth/o2/token").build();


        SellersApi sellersApi = new SellersApi.Builder().awsAuthenticationCredentials(awsAuthenticationCredentials)
                .lwaAuthorizationCredentials(lwaAuthorizationCredentials)
                .awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
                .endpoint("https://sellingpartnerapi-eu.amazon.com").build();

        GetMarketplaceParticipationsResponse res = sellersApi.getMarketplaceParticipations();
        List<MarketplaceParticipation> data = new ArrayList<MarketplaceParticipation>();
        data = res.getPayload();
        for (MarketplaceParticipation obj : data) {
            System.out.println(obj);
        }

错误:

原因:java.lang.RuntimeException:获取 LWA 访问令牌时出错 在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromEndpoint(LWAClient.java:74) 在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromCache(LWAClient.java:51) 在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessToken(LWAClient.java:40) 在 com.amazon.SellingPartnerAPIAA.LWAAuthorizationSigner.sign(LWAAuthorizationSigner.java:69) 在 com.amazon. sellpartner.ApiClient.buildRequest(ApiClient.java:1034) 在 com.amazon. sellpartner.ApiClient.buildCall(ApiClient.java:973) 在 com.amazon. sellpartner.api.SellersApi.getMarketplaceParticipationsCall(SellersApi.java:111) 在 com.amazon. sellpartner.api.SellersApi.getMarketplaceParticipationsValidateBeforeCall(SellersApi.java:118) 在 com.amazon. sellpartner.api.SellersApi.getMarketplaceParticipationsWithHttpInfo(SellersApi.java:141) 在 com.amazon. sellpartner.api.SellersApi.getMarketplaceParticipations(SellersApi.java:130) 在 com.yash.spapi.TestSpApiApplication.main(TestSpApiApplication.java:47) ... 5 更多 原因:java.io.IOException:LWA 令牌交换不成功 在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromEndpoint(LWAClient.java:63) ... 15 更多

【问题讨论】:

    标签: java amazon-mws amazon-marketplace


    【解决方案1】:

    在构造LWAAuthorizationCredentials 时,您似乎没有提供刷新令牌。尝试在.clientSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") 之后插入.refreshToken("&lt;your-refresh-token&gt;")

    以下代码适用于我(使用自我授权,当然还有正确的安全参数):

    package amzspapitest;
    
    import com.amazon.SellingPartnerAPIAA.AWSAuthenticationCredentials;
    import com.amazon.SellingPartnerAPIAA.AWSAuthenticationCredentialsProvider;
    import com.amazon.SellingPartnerAPIAA.LWAAuthorizationCredentials;
    import io.swagger.client.ApiException;
    import io.swagger.client.api.SellersApi;
    import io.swagger.client.model.GetMarketplaceParticipationsResponse;
    import io.swagger.client.model.MarketplaceParticipation;
    import java.util.List;
    import java.util.UUID;
    
    public class AmzSPAPITest {
        protected final String awsAccessKeyId = "XXXXXXXXXXXXXXXXXXXX";
        protected final String awsSecretAccessKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        protected final String awsRegion = "us-east-1";
        
        protected final String awsRoleArn = "arn:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        
        protected final String awsClientId = "amzn1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        protected final String awsClientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        protected final String awsRefreshToken = "Atzr|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
                "XXXXXXXXXXXXXXXXXXXXXXXX";
        protected final String awsEndpoint = "https://api.amazon.com/auth/o2/token";
    
        public static void main(String[] args) {
            new AmzSPAPITest().amazonAwsTest();
        }
    
        public void amazonAwsTest() {
            try {
                AWSAuthenticationCredentials aac = AWSAuthenticationCredentials.builder()
                        .accessKeyId(awsAccessKeyId)
                        .secretKey(awsSecretAccessKey)
                        .region(awsRegion)
                        .build();
    
                AWSAuthenticationCredentialsProvider aacp = AWSAuthenticationCredentialsProvider.builder()
                        .roleArn(awsRoleArn)
                        .roleSessionName(UUID.randomUUID().toString())
                        .build();
    
                LWAAuthorizationCredentials lac = LWAAuthorizationCredentials.builder()
                        .clientId(awsClientId)
                        .clientSecret(awsClientSecret)
                        .refreshToken(awsRefreshToken)
                        .endpoint(awsEndpoint)
                        .build();
    
                SellersApi sa = new SellersApi.Builder()
                        .awsAuthenticationCredentials(aac)
                        .lwaAuthorizationCredentials(lac)
                        .awsAuthenticationCredentialsProvider(aacp)
                        .endpoint("https://sellingpartnerapi-na.amazon.com")
                        .build();
    
                GetMarketplaceParticipationsResponse res = sa.getMarketplaceParticipations();
                List<MarketplaceParticipation> data = res.getPayload();
                for (MarketplaceParticipation obj: data) {
                    System.out.println(obj);
                }
            } catch (ApiException e) {
                e.printStackTrace(System.err);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2023-03-11
      • 2013-08-17
      相关资源
      最近更新 更多