在URL中使用冒号(:)请求AWS时签名无效

时间:2017-07-12 17:34:24

标签: amazon-web-services httprequest signature

我向AWS发出请求:POST https://myapi.com/users/us-west-2:123

如果我放弃us-west-2:但包括生成

,它可以正常工作
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method.

这似乎是:的原因,因为它需要进行URL编码。使用编码的uri生成签名会生成相同的错误!

POST https://myapi.com/users/us-west-2%3A123

发生了什么事?我的签名生成器使用

{
  "path": "/users/us-west-2%3A123",
  "headers": {
    "X-Amz-Date": timestamp,
    "host": "myapi.com",
  },
  "body": "",
}

我使用此生成的代码向POST发出https://myapi.com/users/us-west-2%3A123请求,但没有正文。

2 个答案:

答案 0 :(得分:1)

哇。我懂了。

以下是发生的事情:

我正在生成请求/users/us-west-2%3A123,当我生成签名时,我使用的包(react-native-aws-signature)将%编码为百分比,因此它将%转换为{{1} }}!

修复方法是切换到%25或更确切地说是分叉aws4并在签名请求中使用aws4-react-native选项。我也将doNotEncodePath: true请求(节点)发送到fetch

我要感谢亚马逊支持,GitHub和运气。

答案 1 :(得分:0)

我也遇到了这个问题。在我们的应用程序中,我们希望能够将id作为pathParamter发送,如此

/admin/eu-west-1:xxxx-xxxx-xxxx-xxx
error Msg: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method.

如果我删除冒号(:)并将其替换为任何其他字符,例如%或任何数字/字符,我的请求就会消失。

我知道有可能的解决方案来重构API以接受2个单独的参数,例如region和id。

/users/{region}/{id}
Example: /users/eu-west-1/xxxx-xxxx-xxxx-xxx

但是,我们希望我们的API遵循严格的模式,这对我们来说不是最好的解决方案。

我们的模式:

/someObject
GET - get a list
POST - Create
PUT - Update ALL
/{id}
    GET - Get one
    PUT - Update one
    Delete - Delete one