我可以使用 Authorization header 对 Amazon SNS 进行身份验证,就像我在使用 S3 时所做的那样吗?

Can I use Authorization header to authenticate to Amazon SNS, like I do when using S3?

我正在尝试执行一个简单的 HTTP 请求,该请求会向 Amazon SNS 发布一条消息。没有 SDK,只是普通 curl.

我开始使用与访问 Amazon S3 相同的方法,即在请求中包含 Authorization header。这是从 S3 下载文件列表的工作代码示例:

date=$(date +"%a, %d %b %Y %T %z")
name=$(basename "$f")
acl="x-amz-acl:bucket-owner-full-control"
string="GET\n\n\n$date\n/$bucket/"
signature=$(echo -en "$string" | openssl sha1 -hmac "$secret_key" -binary | base
64)

prefix="daily-$(date -u +"%FT%H-")"

echo "Downloading the list..."
curl \
    -H "Host: ${bucket}.s3.amazonaws.com" \
    -H "Date: $date" \
    -H "Authorization: AWS ${access_key}:$signature" \
    --connect-timeout 1 \
    "https://${bucket}.s3.amazonaws.com/?prefix=$prefix&max-keys=10000"

试图对 SNS 做同样的事情,这就是我得到的:

date=$(date +"%a, %d %b %Y %T %z")
string="GET\n\n\n$date\n/"
signature=$(echo -en "$string" | openssl sha1 -hmac "$secret_key" -binary | base
64)

curl \
    -X POST \
    -G \
    -H "Host: sns.us-west-2.amazonaws.com" \
    -H "Date: $date" \
    -H "Authorization: AWS ${access_key}:$signature" \
    "https://sns.us-west-2.amazonaws.com/" \
    --data-urlencode "Action=Publish" \
    --data-urlencode "TargetArn=$arn" \
    --data-urlencode "Message=Hello, World!" \
    --data-urlencode "Version=2010-03-31"

当我 运行 代码时,这是我得到的响应:

<ErrorResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
  <Error>
    <Type>Sender</Type>
    <Code>MissingAuthenticationToken</Code>
    <Message>Request is missing Authentication Token</Message>
  </Error>
  <RequestId>...</RequestId>
</ErrorResponse>

官方文档解释了 how to authenticate requests,提出了一种与我过去对 S3 所采用的方法截然不同的方法。

为什么有两种方法,一种用于 Amazon S3,另一种似乎用于所有其他服务?

我可以做些什么来将我用于 S3 的旧方法用于 SNS?要在请求中添加任何参数以强制其使用旧方法吗?

您的 S3 示例似乎使用了 Signature Version 2。这基于您的字符串以 HTTP 动词(在本例中为 GET)开头进行签名。

Signature Version 4 is the recommended way to sign your requests,并且是您针对不同方法所链接的内容。

除 SimpleDB 之外的所有服务都使用 Signature Version 4,因此学习这种新方法应该可以让您通常为(几乎)任何 AWS 服务的请求签名。