java - 使用 Selling-Partner Java SDK 的 LWA 令牌交换问题
问题描述
我的代码
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:在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromCache(LWAClient.java:51) 在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromEndpoint(LWAClient.java:74) 处获取 LWA 访问令牌时出错.amazon.SellingPartnerAPIAA.LWAClient.getAccessToken(LWAClient.java:40) 在 com.amazon.SellingPartnerAPIAA.LWAAuthorizationSigner.sign(LWAAuthorizationSigner.java:69) 在 com.amazon. sellingpartner.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) at com.amazon. sellpartner.api.SellersApi.getMarketplaceParticipations(SellersApi.java:130) at com.yash.spapi.TestSpApiApplication.main(TestSpApiApplication.java:47) ... 5 更多作者:java.io.IOException:在 com.amazon.SellingPartnerAPIAA.LWAClient.getAccessTokenFromEndpoint(LWAClient.java:63) 处的 LWA 令牌交换不成功 ... 15 更多
解决方案
在构建LWAAuthorizationCredentials
. 尝试.refreshToken("<your-refresh-token>")
在.clientSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
.
以下代码适用于我(当然有自我授权和正确的安全参数):
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);
}
}
}
推荐阅读
- python - 在networkx中添加多个有向边
- javascript - 使用本地存储制作排行榜但不保存
- python - 尝试将文件上传到 Sharepoint 时收到“ShareplumRequestError: Sharepoint HTTP Post/Get Failed”
- javascript - 从 FiveM 获取信息的命令
- linux - 无法以用户身份启动 VS Code 远程桌面,但可以通过终端以用户身份登录
- r - 将数据框添加到列表并在 R 中重新运行循环
- python - 如何用曲线拟合拟合excel文件的数据?
- flutter - 如何在无状态小部件(屏幕)中启用/禁用(显示/隐藏)子小部件
- python - 如何在 numpy 数组中找到唯一的对象?
- scala - 在 spark 中转换 minHashLSH 的数据帧