我可以使用 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 服务的请求签名。
我正在尝试执行一个简单的 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 服务的请求签名。