Mut*_*tor 5 amazon-web-services amazon-dynamodb
我正在尝试使用 Postman,即 chrome 扩展 api 客户端Postman通过 http 访问 Dynamodb。这实际上是我在Dynamodb Applied Design Patterns 一书中读到的一种方法。看来我做错了什么,因为我无法成功进行身份验证并获得对 Web 服务的访问权限。
我在 Postman 客户端中使用的 url 和标头以及我最近的请求参数和错误消息如下:
url: dynamodb.us-east-1.amazonaws.com
x-amz-date: 20150701T162011Z
x-amz-targe: DynamoDB_20120810.ListTables
authorizaton: AWS4-HMAC-SHA256 Credential=AMyAccessCode/20150701/us-east-1/dynamodb/aws4_request, SignedHeaders=host;x-amz-date;x-amz-target, Signature=8ngTnF8WH//njvBdY5bY5dSp5CAKi8qTXNFuv5Ws+30=
content-type: application/x-amz-json-1.0
Run Code Online (Sandbox Code Playgroud)
我的请求正文是:
{
"ExclusiveStartTableName": "Owner",
"Limit": 3
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
{"__type":"com.amazon.coral.service#InvalidSignatureException","message":"我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。请参阅服务文档以了解详细信息。\n\n此请求的规范字符串应该是\n'POST\n/\n\nhost:dynamodb.us-east-1.amazonaws.com\nx-amz-date:20150701T162011Z\nx-amz-目标:DynamoDB_20120810.ListTables \ n \ n主机X-AMZ-日期; X-AMZ-目标\ nb9e264461dcb0e94e69652f8b2d17c737a29506863d6f09c0f9fc98e9d560e5c'\ n \ n此字符串到注册应该已经\ n'AWS4-HMAC-SHA256 \ n20150701T162011Z \ n20150701 /美-east-1/dynamodb/aws4_request\n7a6da3d9e8ed6317e0cb9217e9ea1174d01e86871a159f339f5f6969283264d5'\n"}
问题/奇怪 1. 当我发出请求时,我通常会收到回复,表明我的请求已过期。错误消息将包括比我使用的实际时间早四个小时的“有效”时间。当我在请求中使用错误信息提供的时间时,我不再收到过期的请求错误信息。
问题 2. 此消息似乎表明我必须计算规范请求的哈希值。亚马逊上的文档对此有点不清楚。我是否需要计算规范请求的 has,如果需要,我是否将其作为标头包含在内”如果是这样,标头名称是什么?
我已经能够计算签名并复制亚马逊文档中的签名。
感谢您的输入。
我能够使用 Postman 3 进行调用。
卷曲示例:
curl -X POST \
https://dynamodb.eu-west-1.amazonaws.com/ \
-H 'authorization: AWS4-HMAC-SHA256 Credential=ABCDDEFSDFDDFDAG/20170725/eu-west-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target, Signature=7402a0163c267385b7270f5c6ce49748518cac4f4d7e03addbd9ddedf9c9970' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'host: dynamodb.eu-west-1.amazonaws.com' \
-H 'postman-token: 0152b36c-2947-2a6f-91b9-87884b38fb50' \
-H 'x-amz-date: 20170725T181135Z' \
-H 'x-amz-target: DynamoDB_20120810.GetItem' \
-d '{
"TableName": "TableName",
"Key": {
"id": {"S": "KeyId"}
}
}'
Run Code Online (Sandbox Code Playgroud)
Update Request更频繁地单击以进行更新x-amz-date你走在正确的道路上。正如您所暗示的,您遇到了 Amazon 使用的 API 身份验证方案的问题。请参阅http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html。
其工作原理是,亚马逊希望您获取一些信息,包括您正在调用的服务和当前时间戳,并使用这些数据和您的 AWS 秘密访问密钥(实际上,他们从您的 AWS 秘密访问密钥中派生出一个密钥)来计算哈希值。秘密访问密钥,但现在不用担心)。
这里的关键设计原则之一是亚马逊希望防止重放攻击,即有人只是发送您已经发送的请求,即使他们无法读取它。亚马逊希望您在请求标头中报告当前时间戳,您将在哈希中包含完全相同的时间戳,当亚马逊收到您的请求时,他们将尝试使用他们获得的所有信息重新计算您的哈希。
如果哈希匹配并且报告的时间戳在当前时间的 15 分钟内,则您被接受。我怀疑 15 分钟的问题是你的问题之一。
至于如何模拟这些调用。我认为您会发现自己编写一个非常基本的 RESTful API 并使用 Amazon 发布的 SDK 来执行这些调用可能会更容易。然后您就不必处理任何疯狂的签名计算,并且可以根据需要调用 API。
| 归档时间: |
|
| 查看次数: |
11285 次 |
| 最近记录: |