首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓,OkHttp,AWS4Signer,api网关-“缺少身份验证令牌”

安卓,OkHttp,AWS4Signer,api网关-“缺少身份验证令牌”
EN

Stack Overflow用户
提问于 2018-04-17 20:07:21
回答 1查看 1.1K关注 0票数 1

我正在尝试签署一个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请求:

代码语言:javascript
复制
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代替=,这会是问题吗?如果是的话,如何防止这种情况发生?

否则,任何帮助解决这一问题将是非常感谢的。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-04-19 14:21:54

设法解决了这个问题。似乎为OkHttp请求分配标头是问题所在。这是我的密码:

我首先获得AWSSessionCredentials凭据。然后:

代码语言:javascript
复制
   AmazonWebServiceRequest amazonWebServiceRequest = new AmazonWebServiceRequest() {
    };

    String API_GATEWAY_SERVICE_NAME = "execute-api";

    com.amazonaws.Request requestAws = new DefaultRequest(amazonWebServiceRequest, API_GATEWAY_SERVICE_NAME);

您可以使用以下任一服务端点:

代码语言:javascript
复制
URI uri = URI.create("https://apigateway.eu-west-1.amazonaws.com");

或者您的api url ( api网关控制台阶段选项(已部署的Api )的api调用url ):

代码语言:javascript
复制
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);

现在签署请求

代码语言:javascript
复制
AWS4Signer signer = new AWS4Signer();
    signer.setServiceName(API_GATEWAY_SERVICE_NAME);
    signer.setRegionName(Region.getRegion(Regions.EU_WEST_1).getName());
    signer.sign(requestAws, credentials);

获取标头

代码语言:javascript
复制
//        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请求:

代码语言:javascript
复制
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电话。

希望这对某人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49886633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档