是否可以像使用S3一样使用Authorization标头向Amazon SNS进行身份验证?

时间:2019-04-12 21:26:30

标签: amazon-web-services amazon-s3 amazon-sns

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

我从使用与访问Amazon S3相同的方法开始,即在请求中包含Authorization标头。下面是工作代码的示例,该代码从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,另一种似乎用于其他服务?

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

1 个答案:

答案 0 :(得分:1)

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

Signature Version 4recommended way to sign your requests,这是您链接到的有关其他方法的内容。

除了SimpleDB之外,所有其他服务都可以使用Signature Version 4,因此学习这种新方法应该可以使您大致(几乎)对任何AWS服务进行请求签名。