vbondarevsky / Connector

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Apache License 2.0
638 stars 207 forks source link

Неверный расчет подписи "AWS4-HMAC-SHA256" при кириллице в URL #152

Closed malikov-pro closed 1 week ago

malikov-pro commented 1 week ago

Входящие данные: Пишу клиент для S3, сервис minio

Аутентификация = БОНД_Коннектор.НоваяАутентификацияAWS4(КлючДоступа, СекретныйКлюч, "s3", Регион);
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
ОтветHTTP = БОНД_Коннектор.ВызватьМетод(Метод, URL, ДополнительныеПараметры);

Для запроса PUT http://10.10.0.30:9000/НоменклатураПрисоединенныеФайлы/f29b5f73-0c08-4041-983f-4643b9100504.txt выдает ошибку "The request signature we calculated does not match the signature you provided. Check your key and signing method."

Для запроса PUT http://10.10.0.30:9000/kot23/NomenklaturaPrisoedinennyeFayly/f29b5f73-0c08-4041-983f-4643b9100504.txt запрос проходит без ошибок

leemuar commented 1 week ago

Не уверен что это проблема библиотеки. Вроде стандарт предписывает кодировать все не-ASCII символы с помощью процента (percent-encoding), но сейчас не готов утверждать это на 100%. Как и не готов утверждать, что кодирование пути - обязанность библиотеки. Она делает это с параметрами запроса (то что идет после ?), но не уверен что должна сама кодировать все остальное

Попробуйте ту часть, которая с кириллицей, самостоятельно закодировать в percent-encoding

malikov-pro commented 1 week ago

Да, вы правы, помогло

Папка = "НоменклатураПрисоединенныеФайлы";
Папка = КодироватьСтроку(Папка, СпособКодированияСтроки.КодировкаURL);
КлючФайла = "/" + Папка + "/" + XMLСтрока(Выборка.Ссылка) + "." + Выборка.Расширение;

Но нужно экранировать только кириллицу, иначе так же в ошибку уходит. По сути в цикле перебирать посимвольно с проверкой <> a_z и A_Z. Может есть где готовое?

leemuar commented 1 week ago

@malikov-pro Думаю для вашего случая достаточно будет использовать для кодирования пути (ключа объекта) СпособКодированияСтроки.URLВКодировкеURL вместо СпособКодированияСтроки.КодировкаURL :

КлючОбъекта = "НоменклатураПрисоединенныеФайлы/f29b5f73-0c08-4041-983f-4643b9100504.txt";
Адрес       = "http://10.10.0.30:9000/" + КодироватьСтроку( КлючОбъекта , СпособКодированияСтроки.URLВКодировкеURL );