调用 aws web api 的问题
Posted
技术标签:
【中文标题】调用 aws web api 的问题【英文标题】:Issue with calling aws web apis 【发布时间】:2014-07-05 14:49:17 【问题描述】:我正在尝试使用 GCM 在我的移动应用程序中实施 AWS 推送通知。作为向 AWS 注册 GCM 令牌的一部分,我正在尝试使用 API [CreatePlatformEndpoint] http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html 使用 AWS 创建端点。作为计算签名的一部分,我关注以下网站
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html#API_SignatureSampleCode
我使用以下代码为 AWS 创建签名版本
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AuthJavaSampleSig2.html
我可以创建以下网址
http://sns.us-west-2.amazonaws.com/?AWSAccessKeyId=XXXXXXXXXXXXX&Action=CreatePlatformEndpoint&CustomUserData=Rajan&PlatformApplicationArn=arn%3Aaws%3Asns%3Aus-west-2%3A798120381702%3Aapp%2FGCM%2FandroidMobilePushApp&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2014-07-04T18%3A35%3A27Z&Token=APA91bHKDGeNTMfCCdy1wetqxAu2yePhrkDb3KZIdYxJD1VoBnN4yh0CCw_WiAUd-MKM4eqjHixIswvMNMAa0FFByTeG0GcitHuqaP6IIMDiSvcbl-jV8jVoAjPufbWUEtDTA-0E8SmTacaLeBrZ-LCTzk65UOzsiunE75M-UalPro6p4bcSpj4&Version=2010-03-31&Signature=zPM6rDK9BhsaMLD5csiAqO6j30tVJ76Yy6FMcOzc4B4%3D%0A
这是我得到的回复。
<ErrorResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
<Error>
<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
<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.
</Message>
</Error>
<RequestId>f00722e6-d9cb-5747-ab51-6ed62f2d6b75</RequestId>
</ErrorResponse>
有人可以指导错误是什么吗?
【问题讨论】:
【参考方案1】:我认为您的签名末尾不应该有%0A
。不知道你从哪里得到的。
【讨论】:
hmac 签名 = f34bw9/GyHmIvzWUgR8Ly4QcO2DprVos7Ww6nRTXZZk= 然后进行 URL 编码并转换为 f34bw9%2FGyHmIvzWUgR8Ly4QcO2DprVos7Ww6nRTXZZk%3D%0A 发送到 hmac 函数的文本是 POST sns.us-west-2.amazonaws.com / AWSAccessKeyId=XXXXXXXXXXXXZ5T7QOSOA&Action=CreatePlatformEndpoint&CustomUserData=Rajan&PlatformApplicationArn=arn%3Aaws%3Asns%3Aus-west-2%3A798120381702 %3Aapp%2FGCM%2FAndroidMobilePushApp&是SignatureMethod = HmacSHA256&SignatureVersion = 2&时间戳= 2014-07-05T15%3A01%3A25Z&令牌= APA91bHKDGeNTMfCCdy1wetqxAu2yePhrkDb3KZIdYxJD1VoBnN4yh0CCw_WiAUd-MKM4eqjHixIswvMNMAa0FFByTeG0GcitHuqaP6IIMDiSvcbl-jV8jVoAjPufbWUEtDTA-0E8SmTacaLeBrZ-LCTzk65UOzsiunE75M-UalPro6p4bcSpj4&版本= 2010-03-31 跨度>f34bw9/GyHmIvzWUgR8Ly4QcO2DprVos7Ww6nRTXZZk=
的 URL 编码版本是 f34bw9%2FGyHmIvzWUgR8Ly4QcO2DprVos7Ww6nRTXZZk%3D
。不应该有%0A
。
%0A 在对 hmac id 进行 URL 编码时被添加。
@RajanPhatak,嗯,不应该。这意味着传递给编码函数的任何内容最后都有一个换行符,这是不应该的。因此,要么是您的 base64 编码在不应该添加换行符时添加了换行符,要么是在 base64 编码和 URL 编码之间添加了换行符。你不是在调试时错误地添加了换行符吗?否则只需检查 base64 输出末尾是否有换行符,并在 URL 编码之前将其删除。【参考方案2】:
最后经过大量调试,我可以解决问题,问题很简单:( ...
这不是 POST 请求。它只能是一个 GET 请求。我不知道为什么文档显示它是一个 POST 请求。
【讨论】:
不要忘记投票和/或接受任何可能有帮助的答案或 cmets :-)以上是关于调用 aws web api 的问题的主要内容,如果未能解决你的问题,请参考以下文章
AWS API Gateway Websocket UnknownError
AWS CloudFormation 可以调用 AWS API 吗?