В настоящее время я реализую приложение для создания подписей Amazon AWS Signature Version 4 (подробности о процессе подписания см. На этой странице: http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html). Удобно, Amazon также поставляет набор тестов для этих подписей. Однако есть один тестовый пример, который я не могу понять. Обратите внимание, что мой вопрос относится только к первому этапу процесса подписания (генерированию канонического запроса) и, в частности, к созданию канонической строки запроса.URL-кодированная строка запроса в соответствии с спецификациями AWS Amazon
запрос ввода HTTP Тестовый пример выглядит следующим образом:
POST /[email protected]#$%^&+=/,?><`";:\|][{} [email protected]#$%^&+=/,?><`";:\|][{} http/1.1
Date:Mon, 09 Sep 2011 23:36:00 GMT
Host:host.foo.com
И это ожидаемый результат для канонического запроса:
POST
/
%20=%2F%2C%3F%3E%3C%60%22%3B%3A%5C%7C%5D%5B%7B%7D&%40%23%24%25%5E=
date:Mon, 09 Sep 2011 23:36:00 GMT
host:host.foo.com
date;host
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Третья строка в каноническом запросе обозначает url- кодированной строки запроса. Но я действительно не понимаю, как они получают там от входа, даже следуя правила, изложенные в документации Sig V4:
Для построения канонической строки запроса, выполните следующие действия:
URI-кодирование каждого имя и значение параметра в соответствии со следующими правилами:
не URL-кодирование любые из безоговорочных символов, RFC 3986 определяет:
AZ, AZ, 0-9, дефис (-), знак подчеркивание (_) , период (.) и тильда (~). Процент-кодировать все остальные символы с% XY, где X и Y - шестнадцатеричные символы (0-9 и верхний регистр A-F).
Например, символ пробела должен быть закодирован как% 20 (не используется «+», как это делают некоторые схемы кодирования), а расширенные символы UTF-8 должны быть в форме% XY% ZA% BC.
Сортировка имен закодированных параметров по коду символов (то есть в строгом порядке ASCII). Например, имя параметра, начинающееся с прописной буквы F (код ASCII 70), предшествует имени параметра, которое начинается с буквы нижнего регистра b (код ASCII 98).
Построить каноническую строку запроса, начав с имени первого параметра в отсортированном списке.
Для каждого параметра добавьте имя параметра, кодированного URI, а затем символ «=» (код ASCII 61), за которым следует значение параметра, закодированного в URI. Используйте пустую строку для параметров, которые не имеют значения.
Добавить символ '&' (код ASCII 38) после каждого значения параметра, за исключением последнего значения в списке.
Может кто-нибудь объяснить? Спасибо за кучу заранее!
Вот и все! Действительно, большое спасибо. Сейчас все фигурирует. Просто небольшая коррекция: 3-й и 4-й ключи отбрасываются из-за пространства в середине строки запроса. Может быть, вы можете отредактировать это выше? Тем не менее, я буду отмечать это как правильный ответ :) – Zasha