1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-06-20 09:19:27 +02:00

Дополнение словарей

This commit is contained in:
Anton Titovets
2025-05-08 08:58:50 +03:00
parent d23a171c22
commit 62cedd64df
10 changed files with 8310 additions and 7996 deletions
+7840 -7788
View File
File diff suppressed because it is too large Load Diff
+6 -5
View File
@@ -1309,7 +1309,7 @@
, СтрокаХеша);
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = OPI_Криптография.HMAC(КлючПодписи, СтрокаДляПодписи, "SHA256");
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Signature", Сигнатура);
@@ -1327,12 +1327,13 @@
Регион = ПолучитьДвоичныеДанныеИзСтроки(Регион);
Сервис = ПолучитьДвоичныеДанныеИзСтроки(Сервис);
AWSЗапрос = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
Sha256_ = "SHA256";
КлючДанных = OPI_Криптография.HMACSHA256(СекретныйКлюч, ДанныеДата);
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
КлючДанных = OPI_Криптография.HMAC(СекретныйКлюч, ДанныеДата, Sha256_);
КлючРегиона = OPI_Криптография.HMAC(КлючДанных, Регион, Sha256_);
КлючСервиса = OPI_Криптография.HMAC(КлючРегиона, Сервис, Sha256_);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, AWSЗапрос);
ФинальныйКлюч = OPI_Криптография.HMAC(КлючСервиса, AWSЗапрос, Sha256_);
Возврат ФинальныйКлюч;
+2 -2
View File
@@ -237,7 +237,7 @@
Хэш = "";
КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(КлючСтрокой);
Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
Результат = OPI_Криптография.HMACSHA(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен), "SHA256");
ТЗнач = Новый ТаблицаЗначений;
ТЗнач.Колонки.Добавить("Ключ");
@@ -268,7 +268,7 @@
КонецЦикла;
DCS = Лев(DCS, СтрДлина(DCS) - 1);
Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
Подпись = OPI_Криптография.HMAC(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS), "SHA256");
Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
+87 -135
View File
@@ -100,7 +100,9 @@
ПараметрыЗапроса.Вставить("code_verifier", "challenge");
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
, ПараметрыЗапроса, , Ложь);
, ПараметрыЗапроса
,
, Ложь);
Возврат Ответ;
@@ -125,7 +127,9 @@
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
, ПараметрыЗапроса, , Ложь);
, ПараметрыЗапроса
,
, Ложь);
Возврат Ответ;
@@ -218,12 +222,12 @@
КонецЕсли;
Если ЗначениеЗаполнено(Поля["media"]) Тогда
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, "POST", URL);
ЭтоV2 = Ложь;
Иначе
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
ЭтоV2 = Истина;
КонецЕсли;
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Поля, Авторизация);
Ответ = Post(URL, Поля, Параметры_, Истина, ЭтоV2);
Возврат Ответ;
@@ -389,9 +393,7 @@
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
Поля.Вставить("media_category", Тип);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL);
ОтветИнициализации = OPI_ЗапросыHTTP.PostСТелом(URL, Поля, Авторизация, Ложь);
ОтветИнициализации = Post(URL, Поля, Параметры);
IDИнициализации = ОтветИнициализации[MID];
IDSИнициализации = ОтветИнициализации[MIS];
@@ -409,8 +411,7 @@
Поля.Вставить("segment_index", OPI_Инструменты.ЧислоВСтроку(Счетчик));
Поля.Вставить("media" , Часть);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL);
Ответ = OPI_ЗапросыHTTP.PostMultipart(URL, Поля, , , Авторизация);
Ответ = PostMultipart(URL, Поля, Параметры);
Счетчик = Счетчик + 1;
@@ -443,8 +444,7 @@
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL);
Ответ = OPI_ЗапросыHTTP.Get(URL, Поля, Авторизация);
Ответ = Get(URL, Поля, Параметры);
Информация = Ответ[ProcessingInfo];
Если Не ЗначениеЗаполнено(Информация) Тогда
@@ -537,132 +537,11 @@
КонецФункции
Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
ЗаголовокАвторизации = "";
МетодХэширования = "HMAC-SHA1";
ВерсияАпи = "1.0";
СтрокаСигнатуры = "";
Подпись = "";
OCK = "oauth_consumer_key";
OTK = "oauth_token";
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
ТаблицаПараметров = Новый ТаблицаЗначений;
ТаблицаПараметров.Колонки.Добавить("Ключ");
ТаблицаПараметров.Колонки.Добавить("Значение");
Для Каждого Поле Из Поля Цикл
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = Поле.Ключ;
НоваяСтрока.Значение = Поле.Значение;
КонецЦикла;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = OCK;
НоваяСтрока.Значение = Параметры[OCK];
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = OTK;
НоваяСтрока.Значение = Параметры[OTK];
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_version";
НоваяСтрока.Значение = ВерсияАпи;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_signature_method";
НоваяСтрока.Значение = МетодХэширования;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_timestamp";
НоваяСтрока.Значение = ТекущаяДатаUNIX;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_nonce";
НоваяСтрока.Значение = ТекущаяДатаUNIX;
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
КонецЦикла;
ТаблицаПараметров.Сортировать("Ключ");
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаСигнатуры = СтрокаСигнатуры
+ СтрокаТаблицы.Ключ
+ "="
+ СтрокаТаблицы.Значение
+ "&";
КонецЦикла;
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
СтрокаСигнатуры = вРег(ВидЗапроса)
+ "&"
+ КодироватьСтроку(URL , СпособКодированияСтроки.КодировкаURL)
+ "&"
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
+ "&"
+ КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
, ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
, ХешФункция.SHA1
, 64);
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
Разделитель = """,";
ЗаголовокАвторизации = ЗаголовокАвторизации
+ "OAuth "
+ "oauth_consumer_key=""" + Параметры[OCK] + Разделитель
+ "oauth_token=""" + Параметры[OTK] + Разделитель
+ "oauth_signature_method=""" + МетодХэширования + Разделитель
+ "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_version=""" + ВерсияАпи + Разделитель
+ "oauth_signature=" + Сигнатура;
СоответствиеЗаголовка = Новый Соответствие;
СоответствиеЗаголовка.Вставить("Authorization", ЗаголовокАвторизации);
Возврат СоответствиеЗаголовка;
КонецФункции
Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
СоответствиеВозврата = Новый Соответствие;
СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
Возврат СоответствиеВозврата;
КонецФункции
Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL)
ProcessingInfo = "processing_info";
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Поля, Авторизация, Ложь);
Ответ = Post(URL, Поля, Параметры);
Информация = Ответ[ProcessingInfo];
Если Не ЗначениеЗаполнено(Информация) Тогда
@@ -679,4 +558,77 @@
КонецФункции
Функция Get(Знач URL, Знач Поля, Знач УчетныеДанные)
Токен = УчетныеДанные["oauth_token"];
Секрет = УчетныеДанные["oauth_token_secret"];
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
Версия = "1.0";
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.УстановитьПараметрыURL(Поля)
.ДобавитьOauthV1Авторизацию(Токен, Секрет, КлючПользователя, СекретПользователя, Версия)
.УстановитьАлгоритмOAuthV1("HMAC", "SHA1")
.ОбработатьЗапрос("GET")
.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
Возврат Результат;
КонецФункции
Функция Post(Знач URL, Знач Поля, Знач УчетныеДанные, Знач JSON = Ложь, Знач ЭтоV2 = Ложь)
Токен = УчетныеДанные["oauth_token"];
Секрет = УчетныеДанные["oauth_token_secret"];
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
Версия = "1.0";
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL);
Если ЭтоV2 Тогда
HttpКлиент.ДобавитьЗаголовок("Authorization", "Bearer " + УчетныеДанные["access_token"]);
Иначе
HttpКлиент.ДобавитьOauthV1Авторизацию(Токен, Секрет, КлючПользователя, СекретПользователя, Версия)
.УстановитьАлгоритмOAuthV1("HMAC", "SHA1");
КонецЕсли;
Если JSON Тогда
HttpКлиент.УстановитьJsonТело(Поля);
Иначе
HttpКлиент.УстановитьFormТело(Поля);
КонецЕсли;
Возврат HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
КонецФункции
Функция PostMultipart(Знач URL, Знач Поля, Знач УчетныеДанные)
Токен = УчетныеДанные["oauth_token"];
Секрет = УчетныеДанные["oauth_token_secret"];
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
Версия = "1.0";
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.НачатьЗаписьТелаMultipart()
.ДобавитьOauthV1Авторизацию(Токен, Секрет, КлючПользователя, СекретПользователя, Версия)
.УстановитьАлгоритмOAuthV1("HMAC", "SHA1")
.ИспользоватьMultipartПоляВOAuth(Ложь);
Для Каждого Параметр Из Поля Цикл
HttpКлиент.ДобавитьПолеMultipartFormData(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
Возврат Результат;
КонецФункции
#КонецОбласти
+1 -1
View File
@@ -1029,7 +1029,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
Twitter_СоздатьТекстовыйТвит(ПараметрыТеста);
//Twitter_СоздатьТекстовыйТвит(ПараметрыТеста);
Twitter_ЗагрузитьМассивВложений(ПараметрыТеста);
Twitter_СоздатьТвитВидео(ПараметрыТеста);
Twitter_СоздатьТвитКартинки(ПараметрыТеста);
@@ -2464,9 +2464,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции
@@ -71,6 +71,7 @@
Перем ЗапросМетод; // Используемый метод HTTP
Перем ЗапросПараметрыURL; // Структура параметров URL
Перем ЗапросТело; // Данные тела запроса
Перем ЗапросТелоКоллекция; // Данные тела в виде коллекции, если возможно
Перем ЗапросЗаголовки; // Соответствие заголовков запроса
Перем ЗапросПользователь; // Пользователь для базовой авторизации
Перем ЗапросПароль; // Пароль для базовой авторизации
@@ -84,14 +85,10 @@
Перем ЗапросТипУстановленВручную; // Признак отключения автоматического определения Content-Type
Перем ФайлТелаВременный; // Признак удаления файла тела, если он был создан автоматически
// AWS
// Авторизация
Перем AWS4Использовать; // Признак использования AWS4 авторизации
Перем AWS4Данные; // Структура учетных данных
// Bearer
Перем Bearer; // Bearer токен
Перем AuthВид; // Вид авторизации
Перем AuthДанные; // Структура учетных данных
// Ответ
@@ -132,15 +129,15 @@
Инициализирован = Истина;
Ошибка = Ложь;
ЗапросПараметрыURL = Новый Массив;
ЗапросТело = Неопределено;
ЗапросЗаголовки = Новый Соответствие;
ЗапросТаймаут = 3600;
ЗапросПараметрыURL = Новый Массив;
ЗапросТело = Неопределено;
ЗапросТелоКоллекция = Новый Структура;
ЗапросЗаголовки = Новый Соответствие;
ЗапросТаймаут = 3600;
ЗапросТипУстановленВручную = Ложь;
ФайлТелаВременный = Ложь;
AWS4Использовать = Ложь;
ОтветКодСостояния = 0;
ОтветТело = Неопределено;
@@ -374,6 +371,36 @@
КонецФункции
// Использовать multipart поля в OAuth
// Включает или исключает поля multipart тела при расчете подписи OAuth в зависимости от требований сервера
//
// Примечание:
// По умлчанию multipart поля используются при расчете подписи
//
// Параметры:
// Флаг - Булево - Признак использования multipart поле в OAuth - use
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
Функция ИспользоватьMultipartПоляВOAuth(Знач Флаг) Экспорт
Попытка
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
ДобавитьЛог("ИспользоватьMultipartПоляВOAuth: установка значения");
OPI_ПреобразованиеТипов.ПолучитьБулево(Флаг);
УстановитьНастройку("MultipartВOAuth", Флаг);
Возврат ЭтотОбъект;
Исключение
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
#КонецОбласти
#Область УстановкаТела
@@ -497,7 +524,13 @@
ДобавитьЛог("УстановитьJsonТело: начало установки тела");
Если Не ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
Если Не ТипЗнч(Данные) = Тип("Массив") Тогда
ЗапросТелоКоллекция = Данные;
КонецЕсли;
КонецЕсли;
УстановитьТелоИзСтроки(Данные);
@@ -550,7 +583,8 @@
КонецЕсли;
Иначе
ЗапросТелоКоллекция = Данные;
Данные = ПараметрыЗапросаВСтроку(Данные);
КонецЕсли;
@@ -593,6 +627,8 @@
РазделительСтрок = Символы.ВК + Символы.ПС;
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
ЗапросТипДанных = СтрШаблон("multipart/%1; boundary=%2", Вид, Boundary);
ЗапросТелоКоллекция = Новый Структура;
Если ИспользоватьФайл Тогда
@@ -722,6 +758,7 @@
Значение = ?(Значение, "true", "false");
ЗапросЗаписьДанных.ЗаписатьСтроку(Значение);
ЗапросТелоКоллекция.Вставить(ИмяПоля, Значение);
ИначеЕсли ТипЗначения = Тип("ДвоичныеДанные") Тогда
@@ -731,7 +768,8 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
ЗапросЗаписьДанных.ЗаписатьСтроку(Значение);
ЗапросТелоКоллекция.Вставить(ИмяПоля, Значение);
КонецЕсли;
ЗапросЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);
@@ -915,7 +953,9 @@
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Bearer = Токен;
AuthВид = "bearer";
AuthДанные = Токен;
Возврат ЭтотОбъект;
@@ -942,14 +982,14 @@
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
Строка_ = "Строка";
AWS4Использовать = Истина;
Строка_ = "Строка";
AuthВид = "aws4";
AWS4Данные = Новый Структура;
OPI_Инструменты.ДобавитьПоле("AccessKey", AccessKey, Строка_, AWS4Данные);
OPI_Инструменты.ДобавитьПоле("SecretKey", SecretKey, Строка_, AWS4Данные);
OPI_Инструменты.ДобавитьПоле("Region" , Region , Строка_, AWS4Данные);
OPI_Инструменты.ДобавитьПоле("Service" , Service , Строка_, AWS4Данные);
AuthДанные = Новый Структура;
OPI_Инструменты.ДобавитьПоле("AccessKey", AccessKey, Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("SecretKey", SecretKey, Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("Region" , Region , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("Service" , Service , Строка_, AuthДанные);
Возврат ЭтотОбъект;
@@ -959,6 +999,78 @@
КонецФункции
// Добавить OAuth v1 авторизацию !NOCLI
// Добавляет данные для OAuth v1 авторизации
//
// Примечание:
// По умолчанию, для создания подписи используется HMAC-SHA256. Для изменения алгоритма можно восопользоваться функцией^^
// `УстановитьАлгоритмOAuthV1`
//
// Параметры:
// Token - Строка - Token для авторизации - token
// Secret - Строка - Secret для авторизации - secret
// ConsumerKey - Строка - Consumer key для авторизации - ck
// ConsumerSecret - Строка - Consumer secret для авторизации - cs
// Версия - Строка - Версия API - ver
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
Функция ДобавитьOauthV1Авторизацию(Знач Token, Знач Secret, Знач ConsumerKey, Знач ConsumerSecret, Знач Версия) Экспорт
Попытка
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
Строка_ = "Строка";
AuthВид = "oauth1";
AuthДанные = Новый Структура;
OPI_Инструменты.ДобавитьПоле("OAuthToken" , Token , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthSecret" , Secret , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthConsumerKey" , ConsumerKey , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthConsumerSecret", ConsumerSecret , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthАлгоритм" , "HMAC" , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthХешФункция" , "SHA256" , Строка_, AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthВерсияAPI" , Версия , Строка_, AuthДанные);
Возврат ЭтотОбъект;
Исключение
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
// Установить алгоритм OAuth V1
// Изменяет алгоритм для подписи OAuth
//
// Параметры:
// Алгоритм - Строка - Алгоритм шифрования: HMAC, RSA - alg
// ХешФункция - Строка - Хеш функция для сигнатуры: SHA1, SHA256 - hash
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
Функция УстановитьАлгоритмOAuthV1(Знач Алгоритм, Знач ХешФункция) Экспорт
Попытка
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
Если AuthВид <> "oauth1" Тогда
Возврат Ошибка("УстановитьАлгоритмOAuthV1: перед установкой алгоритма авторизация OAuth v1 должна быть инициализирована");
КонецЕсли;
OPI_Инструменты.ДобавитьПоле("OAuthАлгоритм" , Алгоритм , "Строка", AuthДанные);
OPI_Инструменты.ДобавитьПоле("OAuthХешФункция", ХешФункция, "Строка", AuthДанные);
Возврат ЭтотОбъект;
Исключение
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
#КонецОбласти
#Область ОбработкаЗапроса
@@ -1529,16 +1641,8 @@
Запрос.Заголовки.Вставить("Content-Length" , РазмерТела);
КонецЕсли;
Если AWS4Использовать Тогда
ДобавитьЛог("ДополнитьЗаголовки: формирование заголовка AWS4 авторизации");
ДобавитьAWS4();
КонецЕсли;
Если ЗначениеЗаполнено(Bearer) Тогда
ДобавитьЛог("ДополнитьЗаголовки: формирование заголовка Bearer авторизации");
Запрос.Заголовки.Вставить("Authorization", СтрШаблон("Bearer %1", Bearer));
КонецЕсли;
ДополнитьЗаголовкиАвторизации();
Если ПолучитьНастройку("gzip") Тогда
ДобавитьЛог("ДополнитьЗаголовки: установка заголовка ожидания gzip");
@@ -1561,6 +1665,33 @@
КонецФункции
Функция ДополнитьЗаголовкиАвторизации()
Если Не ЗначениеЗаполнено(AuthВид) Тогда
Возврат ЭтотОбъект;
КонецЕсли;
Если AuthВид = "aws4" Тогда
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка AWS4 авторизации");
ДобавитьAWS4();
ИначеЕсли AuthВид = "oauth1" Тогда
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка OAuth V1 авторизации");
ДобавитьЗаголовокOAuthV1();
Иначе
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка Bearer авторизации");
Запрос.Заголовки.Вставить("Authorization", СтрШаблон("Bearer %1", AuthДанные));
КонецЕсли;
Возврат ЭтотОбъект;
КонецФункции
Функция УстановитьТелоЗапроса()
Если Multipart Тогда
@@ -2009,7 +2140,7 @@
Функция СоздатьЗаголовокАвторизации()
AccessKey = AWS4Данные["AccessKey"];
AccessKey = AuthДанные["AccessKey"];
ТекущаяДата = ТекущаяУниверсальнаяДата();
Запрос.Заголовки.Вставить("x-amz-date", OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата));
@@ -2029,16 +2160,16 @@
Функция ПолучитьОсновныеСоставляющиеПодписи(Знач ТекущаяДата)
SecretKey = AWS4Данные["SecretKey"];
Region = AWS4Данные["Region"];
Service = AWS4Данные["Service"];
SecretKey = AuthДанные["SecretKey"];
Region = AuthДанные["Region"];
Service = AuthДанные["Service"];
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
КаноническийЗапрос = СоздатьКаноническийЗапрос();
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = OPI_Криптография.HMAC(КлючПодписи, СтрокаДляПодписи, "SHA256");
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков();
@@ -2073,12 +2204,13 @@
Регион = ПолучитьДвоичныеДанныеИзСтроки(Регион);
Сервис = ПолучитьДвоичныеДанныеИзСтроки(Сервис);
AWSЗапрос = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
SHA256_ = "SHA256";
КлючДанных = OPI_Криптография.HMACSHA256(СекретныйКлюч, ДанныеДата);
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
КлючДанных = OPI_Криптография.HMAC(СекретныйКлюч, ДанныеДата, SHA256_);
КлючРегиона = OPI_Криптография.HMAC(КлючДанных, Регион, SHA256_);
КлючСервиса = OPI_Криптография.HMAC(КлючРегиона, Сервис, SHA256_);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, AWSЗапрос);
ФинальныйКлюч = OPI_Криптография.HMAC(КлючСервиса, AWSЗапрос, SHA256_);
Возврат ФинальныйКлюч;
@@ -2273,6 +2405,144 @@
#КонецОбласти
#Область OAuth
Функция ДобавитьЗаголовокOAuthV1()
OAuthАлгоритм = AuthДанные["OAuthАлгоритм"];
OAuthХешФункция = AuthДанные["OAuthХешФункция"];
OAuthToken = AuthДанные["OAuthToken"];
OAuthSecret = AuthДанные["OAuthSecret"];
OAuthConsumerKey = AuthДанные["OAuthConsumerKey"];
OAuthConsumerSecret = AuthДанные["OAuthConsumerSecret"];
OAuthВерсияAPI = AuthДанные["OAuthВерсияAPI"];
МетодХэширования = OAuthАлгоритм + "-" + OAuthХешФункция;
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
ЗаголовокАвторизации = "";
СтрокаСигнатуры = "";
Подпись = "";
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
ТаблицаПараметров = Новый ТаблицаЗначений;
ТаблицаПараметров.Колонки.Добавить("Ключ");
ТаблицаПараметров.Колонки.Добавить("Значение");
Если Не ЗначениеЗаполнено(ЗапросТелоКоллекция)
Или Не OPI_Инструменты.ЭтоКоллекция(ЗапросТелоКоллекция, Истина) Тогда
Попытка
ЗапросТелоКоллекция = ЗапросТело;
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ЗапросТелоКоллекция);
Исключение
ЗапросТелоКоллекция = Новый Структура;
КонецПопытки;
КонецЕсли;
Если ПолучитьНастройку("MultipartВOAuth") Или Не Multipart Тогда
Для Каждого Поле Из ЗапросТелоКоллекция Цикл
Если ТипЗнч(Поле.Значение) = Тип("ДвоичныеДанные") Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = Поле.Ключ;
НоваяСтрока.Значение = Поле.Значение;
КонецЦикла;
КонецЕсли;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_consumer_key";
НоваяСтрока.Значение = OAuthConsumerKey;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_token";
НоваяСтрока.Значение = OAuthToken;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_version";
НоваяСтрока.Значение = OAuthВерсияAPI;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_signature_method";
НоваяСтрока.Значение = МетодХэширования;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_timestamp";
НоваяСтрока.Значение = ТекущаяДатаUNIX;
НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_nonce";
НоваяСтрока.Значение = ТекущаяДатаUNIX;
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
КонецЦикла;
ТаблицаПараметров.Сортировать("Ключ");
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаСигнатуры = СтрокаСигнатуры
+ СтрокаТаблицы.Ключ
+ "="
+ СтрокаТаблицы.Значение
+ "&";
КонецЦикла;
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
СтрокаСигнатуры = вРег(ЗапросМетод)
+ "&"
+ КодироватьСтроку(ЗапросURL, СпособКодированияСтроки.КодировкаURL)
+ "&"
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
Подпись = КодироватьСтроку(OAuthConsumerSecret, СпособКодированияСтроки.КодировкаURL)
+ "&"
+ КодироватьСтроку(OAuthSecret, СпособКодированияСтроки.КодировкаURL);
ПодписьДД = ПолучитьДвоичныеДанныеИзСтроки(Подпись);
СигнатураДД = ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры);
Сигнатура = OPI_Криптография.СоздатьПодпись(ПодписьДД, СигнатураДД, OAuthАлгоритм, OAuthХешФункция);
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
Разделитель = """,";
ЗаголовокАвторизации = ЗаголовокАвторизации
+ "OAuth "
+ "oauth_consumer_key=""" + OAuthConsumerKey + Разделитель
+ "oauth_token=""" + OAuthToken + Разделитель
+ "oauth_signature_method=""" + МетодХэширования + Разделитель
+ "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_version=""" + OAuthВерсияAPI + Разделитель
+ "oauth_signature=" + Сигнатура;
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Возврат ЭтотОбъект;
КонецФункции
#КонецОбласти
#Область Вспомогательные
Функция ОстановитьРаботу(Знач ИсключениеПриОшибке = Ложь)
@@ -2346,6 +2616,7 @@
Настройки.Вставить("ОтдельныеЭлементыМассивов", Ложь);
Настройки.Вставить("КодировкаURL" , Истина);
Настройки.Вставить("КодировкаТелаЗапроса" , "UTF-8");
Настройки.Вставить("MultipartВOAuth" , Истина);
КонецПроцедуры
@@ -727,9 +727,9 @@
Попытка
ЭтоОтладка = Неопределено;
ЭтоОтладка = Неопределено;
ЭтоОтладка = ПолучитьПеременнуюСреды("OINT_DEBUG");
ЭтоОтладка = ?(ЗначениеЗаполнено(ЭтоОтладка), ЭтоОтладка, "NO");
ЭтоОтладка = ?(ЗначениеЗаполнено(ЭтоОтладка), ЭтоОтладка, "NO");
Исключение
ЭтоОтладка = "NO";
@@ -35,6 +35,48 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция СоздатьПодпись(Знач КлючПодписи, Знач ДанныеПодписи, Знач Алгоритм, Знач ФункцияХеша) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(КлючПодписи);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ДанныеПодписи);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Алгоритм);
Алгоритм = вРег(Алгоритм);
ФункцияХеша = вРег(ФункцияХеша);
Если Алгоритм = "HMAC" Тогда
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
ИначеЕсли Алгоритм = "RSA" Тогда
Результат = RSA(КлючПодписи, ДанныеПодписи, ФункцияХеша);
Иначе
ВызватьИсключение "Ошибка работы с криптографией: неподдерживаемый метод";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция RSA(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
Компонента = OPI_Компоненты.ПолучитьКомпоненту("Cryptography");
Если ФункцияХеша = "SHA256" Тогда
Результат = Компонента.RsaSha256(Ключ, Данные);
ИначеЕсли ФункцияХеша = "SHA1" Тогда
Результат = Компонента.RsaSha1(Ключ, Данные);
Иначе
Результат = "неподдержииваемый метод хеширования";
КонецЕсли;
Если ТипЗнч(Результат) = Тип("Строка") Тогда
ВызватьИсключение СтрШаблон("Ошибка работы с криптографией: %1", Результат);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -45,27 +87,14 @@
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
Функция HMAC(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
КонецФункции
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);
Возврат Хеширование.ХешСумма;
КонецФункции
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
Дважды = 2;
Дважды = 2;
РазмерБлока = 64;
ТипХеша = ХешФункция[ФункцияХеша];
Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, Тип);
Ключ = Хеш(Ключ, ТипХеша);
КонецЕсли;
Если Ключ.Размер() <= РазмерБлока Тогда
@@ -84,7 +113,16 @@
Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), ТипХеша)), ТипХеша);
КонецФункции
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);
Возврат Хеширование.ХешСумма;
КонецФункции
@@ -378,7 +378,7 @@
// По умлчанию multipart поля используются при расчете подписи
//
// Параметры:
// Флаг - Булево - Признак использования multipart поле в OAuth - use
// Флаг - Булево - Признак использования multipart полей в OAuth - use
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки