【问题标题】:Android, OkHttp, AWS4Signer, aws-api-gateway - "Missing Authentication Token"Android、OkHttp、AWS4Signer、aws-api-gateway - “缺少身份验证令牌”
【发布时间】:2018-09-27 22:10:36
【问题描述】:

我正在尝试使用 okhttp 在 android 中签署对 aws api 网关的 http 请求。我或多或少地使用了这个stackoverflow问题stackoverflow question中的代码

我使用 CognitoCachingCredentialsProvider() 来获取 credentialsProvider 对象。然后我使用 getCredentials() 来获取凭据。然后我使用以下内容:credentials.getAWSAccessKeyId()、credentials.getAWSSecretKey() 和 credentials.getSessionToken() 来获取必要的密钥和令牌。我在邮递员中使用它们并且能够成功执行 api 网关。

使用 okhttp 在 android 中请求失败,返回代码 403 并显示消息“缺少身份验证令牌”。

这就是我准备请求的方式:我构建了一个 DefaultRequest 对象,设置端点和 httpmethod。然后我使用 AWS4Signer 对请求进行签名,将凭证对象作为 signer.sign(defaultRequest, credentials) 参数传递。

我通过在 defaultRequest 上调用 getHeaders() 来获取标题映射。我创建了两个列表,一个称为键的键,一个称为值的值。然后我循环遍历地图,将键和相应的值加载到两个列表中。

然后我按如下方式构建我的 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= 结尾

打印出 okhttp 请求,键 x-amz-security-token 有一个值 .... 以 hKADF87VZ44w9IvZ1gU\u003d 结尾

= 被 \u003d 取代,这可能是问题吗?如果有,如何预防?

否则,我们将不胜感激任何解决此问题的帮助。

谢谢

【问题讨论】:

    标签: android aws-api-gateway okhttp3


    【解决方案1】:

    设法解决了这个问题。似乎将标头分配给 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 Gateway 控制台阶段选项(已部署的 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 调用。

    希望这对某人有帮助。

    【讨论】:

    • 嗨@Clive Sargeant。我需要知道 AWS 是否会就使用 AWS4Signer 和 AmazonWebServiceRequest 等方法向您收费?
    • 嗨@Clive,你能帮助Hod你是否为X-Amz-Content-Sha256添加了一个标题。我可以发送请求。但是,我收到 403 错误代码。你能帮忙吗
    猜你喜欢
    • 2020-09-18
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2019-03-25
    • 2017-12-07
    • 2020-07-18
    相关资源
    最近更新 更多