ApiGateway Autogenerated SDK“我们计算的请求签名与您提供的签名不匹配”错误

时间:2016-09-10 13:42:51

标签: amazon-web-services aws-lambda aws-api-gateway

我尝试了所有解决方案(看似有意义):

我查看了一些不适用的其他帖子。

我正在使用无服务器框架来生成我的后端。它使用API​​网关与AWS lambda和DynamoDB。有4个其他API调用完美地工作,只有这一个调用给我带来了问题。

致电代码:

//code that calls it
        apiClientFactory = new ApiClientFactory();
        apiClientFactory.credentialsProvider(credentialsProvider);
        accountApiClient = apiClientFactory.build(DevsupercoolsoftwareClient.class);
...
    public static InviteCodeResponseModel createInviteCode(InviteCodeRequestModel request) {
        //request has one value, which is set to "USER"
        InviteCodeResponseModel response = accountApiClient.accountInviteCodeGet(request);
        return response;
    }

错误:

Caused by: com.amazonaws.mobileconnectors.apigateway.ApiClientException: {"message":"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.\n\nThe Canonical String for this request should have been\n'POST\n...\n"}
(Service: DevsupercoolsoftwareClient; Status Code: 403; Error Code: null; Request ID: bd8d4c91-7758-11e6-a0a0-69136ab6b7af)
  at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.handleResponse(ApiClientHandler.java:255)
  at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.invoke(ApiClientHandler.java:88)
  at java.lang.reflect.Proxy.invoke(Proxy.java:393)
  at $Proxy1.accountInviteCodeGet(Unknown Source)
  at com.camhart.supercoolsoftware.communicator.BackendCommunicator.createInviteCode(BackendCommunicator.java:62)
  at com.camhart.supercoolsoftware.activities.Devices.triggerShareMenu(Devices.java:159)
  at com.camhart.supercoolsoftware.activities.Devices.access$100(Devices.java:27)
  at com.camhart.supercoolsoftware.activities.Devices$2.doInBackground(Devices.java:134)
  at com.camhart.supercoolsoftware.activities.Devices$2.doInBackground(Devices.java:128)
  at android.os.AsyncTask$2.call(AsyncTask.java:295)
  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 4 more

1 个答案:

答案 0 :(得分:0)

accountInviteCodeGet的调用尝试使用方法体进行HTTP GET调用。看来这是不允许的。一旦我将其更改为POST,一切都很顺利。

我会尝试找一些描述此行为的文档。如果可以,我可以编辑它或将其放在评论中。

修改 我与AWS支持人员进行了交流。以下是他们指出我说不可能使用HTTP get请求包含消息体。

“一般来说,根据HTTP / 1.1规范: RFC 2616第4.3节明确规定: 如果请求方法的规范(第5.1.1节)不允许在请求中发送实体主体,则消息主体不得包含在请求中。 [+] https://tools.ietf.org/html/rfc2616#section-4.3