0

我对 AWS 很陌生,我想在我的 Android 应用程序中使用一项服务。不幸的是,这项服务 AWS AppConfig 还没有移动 SDK,所以我一直在尝试使用 okhttp 向GetConfiguration API发送 GET 请求。

为了签署请求,我使用AWS Android SDK 中的AWS4Signer。我正在提供具有AWSCredentials实施的凭证。

    com.amazonaws.Request requestAws = new DefaultRequest(amazonWebServiceRequest, serviceName);
    URI uri = URI.create("https://appconfig.us-west-2.amazonaws.com/applications/[applicationID]/environments/[environmentID]/configurations/[configurationID]?client_id=ClientId");
    requestAws.setEndpoint(uri);
    requestAws.setHttpMethod(HttpMethodName.GET);
    AWS4Signer signer = new AWS4Signer();
    signer.setServiceName(serviceName);
    signer.setRegionName(Regions.US_WEST_2.getName());
    signer.sign(requestAws, credentials);
    // get relevant authorization headers from requestAws and insert them in the okhttp request as headers

当我向 GetConfiguration 发送请求时,它失败了

The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

我尝试向GetDeploymentStrategy发送请求,并且成功,因此我认为这不是我的凭据或我将它们附加到请求的方式。

我认为问题在于我如何附加请求参数,因为不需要额外请求参数的 API 成功(GetDeploymentStrategy 和 GetApplication),而需要client_id的 GetConfiguration 失败。

我的问题是:是否有任何示例说明如何使用签名者和请求处理请求参数?

非常感谢。

4

1 回答 1

0

花更多时间尝试不同的事情,我有一些有用的东西。查询参数需要使用 com.amazonaws.Request 的setParameters方法附加。我对资源路径和setResourcePath做了同样的事情。

创建要签名的请求的示例:

private static String endpoint = "https://appconfig.us-west-2.amazonaws.com";
private static String resourcePath = "/applications/[applicationID]/environments/[environmentID]/configurations/[configurationID]";
private static String parameters = "?client_id=hello&client_configuration_version=0";
private static String fullUrl = endpoint + resourcePath + parameters;
private static String serviceName = "appconfig";

private com.amazonaws.Request createAwsRequest() {
    AmazonWebServiceRequest amazonWebServiceRequest = new AmazonWebServiceRequest() {
    };

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

    URI uri = URI.create(endpoint);
    requestAws.setEndpoint(uri);
    requestAws.setResourcePath(resourcePath);
    Map<String, String> params = new HashMap<>();
    params.put("client_id", "hello");
    params.put("client_configuration_version", "0");
    requestAws.setParameters(params);
    requestAws.setHttpMethod(HttpMethodName.GET);

    return requestAws;
}
于 2020-01-15T01:08:19.217 回答