我正在尝试执行一个简单的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的旧方法吗?在请求中添加任何参数以强制其使用旧方法?
答案 0 :(得分:1)
似乎您的S3示例使用的是Signature Version 2。这是基于您要以HTTP动词(在本例中为GET)开头的字符串进行签名的。
Signature Version 4是recommended way to sign your requests,这是您链接到的有关其他方法的内容。
除了SimpleDB之外,所有其他服务都可以使用Signature Version 4,因此学习这种新方法应该可以使您大致(几乎)对任何AWS服务进行请求签名。