我正在尝试签署一个http请求到aws网关在android上使用okhttp。在这个堆栈溢出问题stackoverflow question中,我或多或少地使用了代码
我使用CognitoCachingCredentialsProvider()获取一个credentialsProvider对象。然后使用getCredentials()获取凭据。然后,我使用以下方法: credentials.getAWSAccessKeyId()、credentials.getAWSSecretKey()和credentials.getSessionToken()来获取必要的键和令牌。我在postman中使用它们,并且能够成功地执行api网关。
该请求在android中使用okhttp失败,返回带有消息“缺失身份验证令牌”的代码403。
我就是这样准备请求的:我构建了一个DefaultRequest对象,设置了端点和httpmethod。然后使用AWS4Signer对请求进行签名,将凭据对象作为signer.sign(defaultRequest,凭据)参数传递。
通过在getHeaders上调用defaultRequest (),我得到了一个标题映射。我创建了两个列表,一个名为键,另一个名为值。然后循环遍历映射,将键和相应的值加载到两个列表中。
然后,按照以下方式构建我的okhttp请求:
Request request = new Request.Builder()
.url(my ApiEndPoint)
.addHeader(key.get(0), value.get(0))
.addHeader(key.get(1), value.get(1))
.addHeader(key.get(2), value.get(2))
.addHeader(key.get(3), value.get(3))
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.post(body)
.build();我注意到以下情况:
在标头映射中,键x-amz-security-token在hKADF87VZ44w9IvZ1gU=中有一个值....ending
打印出okhttp请求,键x-amz-security-token有一个值.以hKADF87VZ44w9IvZ1gU\u003d结尾
用\u003d代替=,这会是问题吗?如果是的话,如何防止这种情况发生?
否则,任何帮助解决这一问题将是非常感谢的。
谢谢
发布于 2018-04-19 14:21:54
设法解决了这个问题。似乎为OkHttp请求分配标头是问题所在。这是我的密码:
我首先获得AWSSessionCredentials凭据。然后:
AmazonWebServiceRequest amazonWebServiceRequest = new AmazonWebServiceRequest() {
};
String API_GATEWAY_SERVICE_NAME = "execute-api";
com.amazonaws.Request requestAws = new DefaultRequest(amazonWebServiceRequest, API_GATEWAY_SERVICE_NAME);您可以使用以下任一服务端点:
URI uri = URI.create("https://apigateway.eu-west-1.amazonaws.com");或者您的api url ( api网关控制台阶段选项(已部署的Api )的api调用url ):
String invokeUrl = "https://xxxx.execute-api.eu-west-1.amazonaws.com/yyy/zzzzz";
// using the invoke url
URI uri = URI.create(invokeUrl);
requestAws.setEndpoint(uri);
requestAws.setResourcePath(invokeUrl);
requestAws.setHttpMethod(HttpMethodName.POST);现在签署请求
AWS4Signer signer = new AWS4Signer();
signer.setServiceName(API_GATEWAY_SERVICE_NAME);
signer.setRegionName(Region.getRegion(Regions.EU_WEST_1).getName());
signer.sign(requestAws, credentials);获取标头
// get map of headers
Map<String, String> headers = requestAws.getHeaders();
// create objects for the headers to add manually in OkHttp request builder
String x_date = null;
String x_token = null;
String authorization = null;
//get and assign values
for (Map.Entry<String, String> entry : headers.entrySet()) {
if (entry.getKey().equals("x-amz-security-token")) {
x_token = entry.getValue();
}
if (entry.getKey().equals("X-Amz-Date")) {
x_date = entry.getValue();
}
if (entry.getKey().equals("Authorization")) {
authorization = entry.getValue();
}
}构建OkHttp请求:
Request request = new Request.Builder()
.url(invokeUrl)
.addHeader("Content-Type", "application/json")
.addHeader("X-Amz-Date", x_date)
.addHeader("x-amz-security-token", x_token)
.addHeader("Authorization", authorization)
.post(body)
.build();现在打你的OkHttp电话。
希望这对某人有帮助。
https://stackoverflow.com/questions/49886633
复制相似问题