mirror of
https://github.com/vbondarevsky/Connector.git
synced 2024-11-24 08:42:15 +02:00
Digest-аутентификация
This commit is contained in:
parent
374cb02580
commit
dc4f3c1ae1
@ -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
|
||||
|
||||
|
@ -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);
|
||||
Результат.Добавить(ПерваяЧасть);
|
||||
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
|
||||
КонецЦикла;
|
||||
|
@ -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>
|
Loading…
Reference in New Issue
Block a user