Могу ли я использовать заголовок авторизации для аутентификации в Amazon SNS, как при использовании S3? - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь сделать простой 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>

Официальная документация объясняет , как аутентифицировать запросы , представляя совершенно другой подход, который я использовал для S3.

Почему существует два подхода: один для Amazon S3, а другой, похоже, для любого другого сервиса?

Что я могу сделать, чтобы использовать для SNS старый подход, который я использовал для S3? Любой параметр, чтобы добавить в запрос, чтобы заставить его использовать старый подход?

1 Ответ

1 голос
/ 13 апреля 2019

Похоже, вы могли использовать Signature Version 2 для вашего примера S3.Это основано на вашей строке для подписи, начинающейся с глагола HTTP (в данном случае GET).

Подпись версии 4 - это рекомендуемый способ подписать ваши запросы ,и это то, что вы связали с другим подходом.

Все сервисы, кроме SimpleDB, работают с Signature Version 4, и поэтому изучение этого нового подхода должно позволить вам в целом подписывать свои запросы (почти) на любые сервисы AWS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...