【问题标题】:Where am I going wrong in the Amazon DynamoDB query API Signing Process我在 Amazon DynamoDB 查询 API 签名过程中哪里出错了
【发布时间】:2015-09-22 04:30:15
【问题描述】:

我正在使用一个名为 Alteryx 的产品,并且我正在尝试编写一个利用 Dynamodb 查询 API 的 Alteryx 宏,以便我可以从 Alteryx 中访问我的 Dynamodb 表。不幸的是,我无法使用其中一个 Amazon SDK,因此必须手动/在 Alteryx 中编写 Amazon 查询 api 签名。

我正在使用 Amazon 文档中包含的 Python Post 示例来指导我完成整个过程。 Python 示例可以在这里找到:Python Post Example

我已经完成了示例中列出的每一项任务:

  1. 定义请求变量
  2. 创建规范请求
  3. 创建要签名的字符串
  4. 计算签名
  5. 向请求添加签名信息并提出请求。

最初我收到以下错误:

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"}

接下来我将我的规范请求与错误消息中提供的请求进行了比较。这是我发现的:

  1. 请求相同,但有一个例外。错误消息中提供的规范请求具有 content-type: 标头,但排除了相关的内容类型值。
  2. 我的规范请求包括内容类型标头和值。
  3. 规范请求末尾的请求参数哈希与其他所有内容完美匹配。

这很重要,因为规范请求是流程下一步的输入。您必须计算规范请求的 sha256 哈希摘要以创建要签名的字符串。对于这个问题,我尝试了两种替代方法/解决方法:

  1. 首先我使用我导出的规范请求(包括内容类型值)来计算要签名的字符串。在这种情况下,所有内容都与错误消息 String To Sign 匹配,除了最后一个元素:规范请求的哈希。
  2. 我的下一个方法是计算一个排除内容类型值的规范请求,因此与错误消息中包含的规范请求完全匹配。在这种情况下,派生的要签名的字符串完美匹配,但规范请求的哈希除外。

问题2:有没有人遇到过这个错误?你知道原因和/或你有解决方法吗?

我希望一旦我能够解决问题 3,我将能够成功完成第四个任务,计算签名并成功发出 api 请求。

问题 3:是否有人知道此过程中的任何其他问题或有任何其他建议或见解。

【问题讨论】:

  • 您熟悉 UTC 吗?这就是Z 在时间戳中的含义。不是当地时间。您是否在请求中发送了有效且合理的 Content-Type: 标头?
  • 这是 UTC 洞察力。 4小时的调整效果很好。这是我用于内容类型的内容:application/x-amz-json-1.0
  • 所以时间必须是 UTC 才能进行签名。还要检查系统上的时钟是否设置正确(如果需要,通过 ntp 更新)

标签: python amazon-web-services hash amazon-dynamodb alteryx


【解决方案1】:

除非您有非常具体的理由手动执行此操作,否则标准建议是使用 boto 从 Python 访问 AWS。

编辑:更一般地说,标准建议是使用适合您用例的可用库。

编辑 2:请参阅有关 sys.path 的 cmets 以及针对您的情况的解决方法。

【讨论】:

  • 明白,很遗憾,在这种情况下,我无法使用该选项。
  • 如果你不介意我问,为什么?您当前的用例有哪些特殊限制?
  • 我使用了一个名为 Alteryx 的数据混合软件,我正在尝试为 Alteryx 编写一个 Dynamodb 连接器。因此,我不得不通过 Alteryx 的宏功能来开发连接器。
  • 我不熟悉那个特定的产品。有什么方法可以让外部库进入PYTHONPATH?或者,是否有某种方法可以直接在源代码分发中手动包含库? (这通常是个坏主意,但我认为它比手动重新实现一些现有库更可取。)
  • 即我宁愿手动将 boto 包的内容放到我的项目中,而不是重新实现其中的功能。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2021-04-18
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多