1
0
mirror of https://github.com/vbondarevsky/Connector.git synced 2024-11-24 08:42:15 +02:00

Digest-аутентификация

This commit is contained in:
Vladimir 2019-01-22 04:19:31 +03:00
parent 374cb02580
commit dc4f3c1ae1
3 changed files with 115 additions and 15 deletions

View File

@ -208,6 +208,14 @@ TODO: Можно показать пример поискового запрос
```
## Digest-аутентификация
Параметры Digest-аутентификации можно передать через свойство `ДополнительныеПараметры.Аутентификация`.
При этом `Тип` нужно установить в значение `Digest`.
```bsl
Аутентификация = Новый Структура("Пользователь, Пароль, Тип", "user", "pass", "Digest");
Результат = КоннекторHTTP.GetJson(
"https://httpbin.org/digest-auth/auth/user/pass",,
Новый Структура("Аутентификация", Аутентификация));
```
## Errors and Exceptions

View File

@ -725,13 +725,18 @@
КонецФункции
Функция ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки)
Соединение = ПолучитьСоединение(
РазобратьURL(ПодготовленныйЗапрос.URL), ПодготовленныйЗапрос.Аутентификация, Настройки);
Возврат Соединение.ВызватьHTTPМетод(ПодготовленныйЗапрос.Метод, ПодготовленныйЗапрос.HTTPЗапрос);
КонецФункции
Функция ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, Настройки)
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Соединение = ПолучитьСоединение(
РазобратьURL(ПодготовленныйЗапрос.URL), ПодготовленныйЗапрос.Аутентификация, Настройки);
Ответ = Соединение.ВызватьHTTPМетод(ПодготовленныйЗапрос.Метод, ПодготовленныйЗапрос.HTTPЗапрос);
Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
Для Каждого Обработчик Из ПодготовленныйЗапрос.СобытияНаОтвет Цикл
Если Обработчик = "ОбработкаОтветаСКодом401" Тогда
ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
@ -1433,7 +1438,6 @@
КонецЕсли;
Если Ответ.КодСостояния < 400 ИЛИ Ответ.КодСостояния >= 500 Тогда
// TODO: Здесь нужно что-то сделать
Возврат;
КонецЕсли;
@ -1449,24 +1453,112 @@
КлючЗначение = СтрРазделить(Часть, "=");
ПараметрыDigest.Вставить(КлючЗначение[0], КлючЗначение[1]);
КонецЦикла;
// TODO: Видимо ПараметрыDigest нужно сохранять в сессии, чтобы счетчик сообщений работал корректно
ПодготовленныйЗапрос.Вставить("ПараметрыDigest", ПараметрыDigest);
ПодготовленныйЗапрос.Заголовки.Вставить("Authorization", ПодготовитьЗаголовокDigest(ПодготовленныйЗапрос));
ПодготовленныйЗапрос.HTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
Возврат;
Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
КонецЕсли;
КонецПроцедуры
Функция ОпределитьХешФункцию(Знач Алгоритм)
Алгоритм = ВРег(Алгоритм);
Если Не ЗначениеЗаполнено(Алгоритм) ИЛИ Алгоритм = "MD5" ИЛИ Алгоритм = "MD5-SESS" Тогда
Возврат ХешФункция.MD5;
ИначеЕсли Алгоритм = "SHA" Тогда
Возврат ХешФункция.SHA1;
ИначеЕсли Алгоритм = "SHA-256" Тогда
Возврат ХешФункция.SHA256;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ПодготовитьЗаголовокDigest(ПодготовленныйЗапрос)
Заголовок = "";
Алгоритм = ОпределитьХешФункцию(ПодготовленныйЗапрос.ПараметрыDigest.algorithm);
АлгоритмСтрокой = ВРег(ПодготовленныйЗапрос.ПараметрыDigest.algorithm);
Если Алгоритм = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// TODO: Сделать вычисление DIGEST
СтруктураURL = РазобратьURL(ПодготовленныйЗапрос.URL);
Путь = СтруктураURL.Путь;
Если ЗначениеЗаполнено(СтруктураURL.ПараметрыЗапроса) Тогда
Путь = Путь + "?" + КодироватьПараметрыЗапроса(СтруктураURL.ПараметрыЗапроса);
КонецЕсли;
Возврат Заголовок;
A1 = СтрШаблон("%1:%2:%3",
ПодготовленныйЗапрос.Аутентификация.Пользователь,
ПодготовленныйЗапрос.ПараметрыDigest.realm,
ПодготовленныйЗапрос.Аутентификация.Пароль);
A2 = СтрШаблон("%1:%2", ПодготовленныйЗапрос.Метод, Путь);
HA1 = ХешированиеСтроки(Алгоритм, A1);
HA2 = ХешированиеСтроки(Алгоритм, A2);
Если Не ПодготовленныйЗапрос.ПараметрыDigest.Свойство("last_nonce") Тогда
ПодготовленныйЗапрос.ПараметрыDigest.Вставить("last_nonce");
КонецЕсли;
Если ПодготовленныйЗапрос.ПараметрыDigest.nonce = ПодготовленныйЗапрос.ПараметрыDigest.last_nonce Тогда
ПодготовленныйЗапрос.ПараметрыDigest.nonce_count = ПодготовленныйЗапрос.ПараметрыDigest.nonce_count + 1;
Иначе
ПодготовленныйЗапрос.ПараметрыDigest.Вставить("nonce_count", 1);
КонецЕсли;
ncvalue = Формат(ПодготовленныйЗапрос.ПараметрыDigest.nonce_count, "ЧЦ=8; ЧВН=; ЧГ=");
cnonce = Лев(СтрЗаменить(НРег(Новый УникальныйИдентификатор), "-", ""), 16);
Если АлгоритмСтрокой = "MD5-SESS" Тогда
HA1 = ХешированиеСтроки(Алгоритм, СтрШаблон("%1:%2:%3", HA1, ПодготовленныйЗапрос.ПараметрыDigest.nonce, cnonce));
КонецЕсли;
Если Не ЗначениеЗаполнено(ПодготовленныйЗапрос.ПараметрыDigest.qop) Тогда
respdig = ХешированиеСтроки(Алгоритм, СтрШаблон("%1:%2:%3", HA1, ПодготовленныйЗапрос.ПараметрыDigest.nonce, HA2));
ИначеЕсли ПодготовленныйЗапрос.ПараметрыDigest.qop = "auth"
ИЛИ СтрРазделить(ПодготовленныйЗапрос.ПараметрыDigest.qop, ",", Ложь).Найти("auth") <> Неопределено Тогда
noncebit = СтрШаблон("%1:%2:%3:%4:%5", ПодготовленныйЗапрос.ПараметрыDigest.nonce, ncvalue, cnonce, "auth", HA2);
respdig = ХешированиеСтроки(Алгоритм, СтрШаблон("%1:%2", HA1, noncebit));
Иначе
// INFO: auth-int не реализовано
Возврат Неопределено;
КонецЕсли;
ПодготовленныйЗапрос.ПараметрыDigest.last_nonce = ПодготовленныйЗапрос.ПараметрыDigest.nonce;
base = СтрШаблон("username=""%1"", realm=""%2"", nonce=""%3"", uri=""%4"", response=""%5""",
ПодготовленныйЗапрос.Аутентификация.Пользователь,
ПодготовленныйЗапрос.ПараметрыDigest.realm,
ПодготовленныйЗапрос.ПараметрыDigest.nonce,
Путь,
respdig);
Если ЗначениеЗаполнено(ПодготовленныйЗапрос.ПараметрыDigest.opaque) Тогда
base = base + СтрШаблон(", opaque=""%1""", ПодготовленныйЗапрос.ПараметрыDigest.opaque);
КонецЕсли;
Если ЗначениеЗаполнено(ПодготовленныйЗапрос.ПараметрыDigest.algorithm) Тогда
base = base + СтрШаблон(", algorithm=""%1""", ПодготовленныйЗапрос.ПараметрыDigest.algorithm);
КонецЕсли;
Если ЗначениеЗаполнено(ПодготовленныйЗапрос.ПараметрыDigest.qop) Тогда
base = base + СтрШаблон(", qop=""auth"", nc=%1, cnonce=""%2""", ncvalue, cnonce);
КонецЕсли;
Возврат СтрШаблон("Digest %1", base);
КонецФункции
Функция ХешированиеСтроки(Алгоритм, Строка)
ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);
ХешированиеДанных.Добавить(Строка);
Возврат СтрЗаменить(НРег(ХешированиеДанных.ХешСумма), " ", "");
КонецФункции
@ -1480,7 +1572,7 @@
Прервать;
КонецЕсли;
ПерваяЧасть = Лев(Строка, Позиция - СтрДлина(Разделитель));
ПерваяЧасть = Лев(Строка, Позиция - СтрДлина(Разделитель) + 1);
Результат.Добавить(ПерваяЧасть);
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
КонецЦикла;

View File

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<ConfigDumpInfo xmlns="http://v8.1c.ru/8.3/xcf/dumpinfo" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" format="Hierarchical" version="2.8">
<ConfigVersions>
<Metadata name="CommonModule.КоннекторHTTP" id="b410e6fc-2af6-4b78-8dde-12f5e259926c" configVersion="874e5e338234274a97ef142d4cbb264a00000000"/>
<Metadata name="CommonModule.КоннекторHTTP.Module" id="b410e6fc-2af6-4b78-8dde-12f5e259926c.0" configVersion="26af8be8ec249d408063c3d8a05a809900000000"/>
<Metadata name="CommonModule.КоннекторHTTP" id="b410e6fc-2af6-4b78-8dde-12f5e259926c" configVersion="e5c2e46294abc044bfd28147bdadcbf700000000"/>
<Metadata name="CommonModule.КоннекторHTTP.Module" id="b410e6fc-2af6-4b78-8dde-12f5e259926c.0" configVersion="d87b40fc540e9d41a5e49ae151de6d3a00000000"/>
<Metadata name="Configuration.Конфигурация" id="5eb9462b-b393-47be-933f-eee461b0776c" configVersion="24718196b08e0743ac884ac299bd023100000000"/>
<Metadata name="Configuration.Конфигурация.HomePageWorkArea" id="d50a38bd-46a7-49df-b1c1-97a268165f22.8" configVersion="11d0048f1adb354897dfaea6652a7af300000000"/>
<Metadata name="Constant.Логин" id="8bd340d0-18e1-11e9-928d-9801a79f9261" configVersion="d3732e36a923e348b68566183995259000000000"/>
<Metadata name="Constant.Пароль" id="a9b2d2d8-18e1-11e9-928d-9801a79f9261" configVersion="ad4a5526dac7ad4199ad90825436293800000000"/>
<Metadata name="DataProcessor.Тесты" id="9f97ab24-5fa8-4904-97a8-ba436e571008" configVersion="9c9e2ac2586f2b4c9a594cfe7f2bc75000000000"/>
<Metadata name="DataProcessor.Тесты" id="9f97ab24-5fa8-4904-97a8-ba436e571008" configVersion="4060c245c5b0c540b4eb9805e0e7189700000000"/>
<Metadata name="DataProcessor.Тесты.Form.Форма" id="16f1d17a-2ee6-412e-8eb7-aaa7d4ff8526" configVersion="9c88f1b8f051124d9ba2aa6a448c220800000000"/>
<Metadata name="DataProcessor.Тесты.Form.Форма.Form" id="16f1d17a-2ee6-412e-8eb7-aaa7d4ff8526.0" configVersion="08af72e1dee7cd4bab9e6b3c732176e500000000"/>
<Metadata name="DataProcessor.Тесты.ObjectModule" id="9f97ab24-5fa8-4904-97a8-ba436e571008.0" configVersion="a752dada3584c24493786940243e201e00000000"/>
<Metadata name="DataProcessor.Тесты.ObjectModule" id="9f97ab24-5fa8-4904-97a8-ba436e571008.0" configVersion="2022ba3072e12e4795c161b96b7550f000000000"/>
<Metadata name="Language.Русский" id="f58d5f4e-e29f-439e-ae9f-58b2015e0061" configVersion="3d6c3937a27e474ab74385d3d524188800000000"/>
</ConfigVersions>
</ConfigDumpInfo>