我正在使用一个名为 Alteryx 的产品,并且我正在尝试编写一个利用 Dynamodb 查询 API 的 Alteryx 宏,以便我可以从 Alteryx 中访问我的 Dynamodb 表。不幸的是,我无法使用其中一个 Amazon SDK,因此必须手动/在 Alteryx 中编写 Amazon 查询 api 签名代码。
我正在使用 Amazon 文档中包含的 Python Post 示例来指导我完成整个过程。Python 示例可在此处找到:Python Post Example。
我已经完成了示例中列出的每个任务:
- 定义请求变量
- 创建规范请求
- 创建要签名的字符串
- 计算签名
- 将签名信息添加到请求并发出请求。
最初我收到以下错误:
InvalidSignatureException","message":"Signature·expired:·20150704T101118Z·is·now·earlier·than·20150704T135625Z·(20150704T141125Z·-·15·min.)
虽然我电脑上的时间是正确的,而且我的请求中包含的时间:101118Z 实际上是正确的,但错误消息告诉我签名已经在四个小时前过期了。我解决此错误的方法是在我的日期/时间变量中增加 4 小时,这似乎可以解决问题。
问题 1。是否有人熟悉导致此错误的原因,有没有办法在不给我的日期/时间变量增加 4 小时的情况下修复它。这是否会导致签名 API 签名和请求过程中的额外复杂性。
应用我的日期/时间解决方法后,我收到了一条新的错误消息:
InvalidSignatureException","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\ncontent_type:\nhost:dynamodb.us-east-1.amazonaws.com\nx-amz-date:20150704T141834Z\nx-amz-target:DynamoDB_20120810.CreateTable\n\ncontent_type;host;x-amz-date;x-amz-target\n09a8bcdeea1d20631f887235820bbff0a614679080a2e74a89ceb1a1bcc71b44'\n\nThe·String-to-Sign·should·have·been\n'AWS4-HMAC-SHA256\n20150704T141834Z\n20150704/us-east-1/dynamodb/aws4_request\nec549e12e44faf7ee750e19b570eaf2389f82e722ae2978b535df6fd6f3df129'\n"}
所以接下来我将我的规范请求与错误消息中提供的请求进行了比较。这是我发现的:
- 该请求与一个例外相同。错误消息中提供的规范请求具有 content-type: 标头,但排除了相关的内容类型值。
- 我的规范请求包括内容类型标头和值。
- 规范请求末尾的请求参数哈希与其他所有内容完美匹配。
这很重要,因为规范请求是流程下一步的输入。您必须计算规范请求的 sha256 哈希摘要以创建要签名的字符串。对于这个问题,我尝试了两种替代方法/解决方法:
- 首先,我使用派生的规范请求(包括内容类型值)来计算要签名的字符串。在这种情况下,所有内容都与错误消息 String To Sign 匹配,除了最后一个元素:规范请求的哈希。
- 我的下一个方法是计算排除内容类型值的规范请求,因此与错误消息中包含的规范请求完全匹配。在这种情况下,派生的要签名的字符串完美匹配,但规范请求的哈希除外。
问题2:有没有人遇到过这个错误?你知道原因和/或你有解决方法吗?
我希望一旦我能够解决问题 3,我将能够成功完成第四个任务,计算签名并成功发出 api 请求。
问题 3:是否有人知道此过程中的任何其他问题或有任何其他建议或见解。