1.
user646807_kazako.a911
1425.10.23 09:11 Сейчас в теме
Добрый день!
Мне поставили задачу интеграции сайта ЕФРСБ и 1С.
В сервисе ЕФРСБ есть ws-ссылка, после добавления которой в дереве метаданных появилась структура сервиса, дополнительно есть описание пакетов.
При выполнении любого метода данного сервиса прилетает ошибка 401, не авторизован. Пример кода с результатом ошибка 401:
В описании сервиса нашел что используется «Digest access authentication», гугл не дал результатов как в 1С можно пройти Digest-аутентификацию используя методы web-сервиса. В комментариях к теме https://infostart.ru/1c/tools/835540/, нашел пример, как можно пройти Digest-аутентификацию используя методы http-запроса. Немного переделав код смог авторизоваться на сервисе, запрос на главную страницу сервиса, в ответе получил код 200, вроде все ок.
Адрес сервиса "services.fedresurs.ru", адрес страницы "/Bankruptcy/MessageServiceDemo/WebService.svc", ответ код 200.
Вопрос, можно ли использовать методы web-сервиса описанные в ws-ссылке в http-запросах? Если можно как их формировать?
Например если взять методы, описанные в ws-сслыке, имя сервиса "MessageService", имя порта "BasicHttpBinding_IMessageService". Пытался добавить эти данные в адрес страницы.
Адрес сервиса "services.fedresurs.ru", адрес страницы "/Bankruptcy/MessageServiceDemo/WebService.svc/MessageService/BasicHttpBinding_IMessageService", ответ код 415.
"/Bankruptcy/MessageServiceDemo/WebService/MessageService/BasicHttpBinding_IMessageService", ответ код 404.
Пример кода с авторизацией с помощью http-запроса, ответ код 200
&НаКлиенте
Процедура ТестЕФРСБ(Команда)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("accept", "application/json");
ИмяМетода = "GET";
АдресСервиса = "services.fedresurs.ru";
АдресСтраницы = "/Bankruptcy/MessageServiceDemo/WebService.svc";
HTTPСоединение = Новый HTTPСоединение(АдресСервиса,,,,,,ЗащищенноеСоединение);
HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
// обработка исключения
КонецПопытки;
Если HTTPОтвет.КодСостояния = 401 Тогда
ЗаголовокАвторизации = HTTPОтвет.Заголовки.Получить("WWW-Authenticate");
Если НЕ ЗаголовокАвторизации = Неопределено Тогда
ПараметрыАутентификации = Новый Структура;
ЗаголовокАвторизации = СтрЗаменить(ЗаголовокАвторизации,"Digest","");
МассивПараметров = СтрРазделить(ЗаголовокАвторизации,",");
Для Каждого ТекПараметрСтрокой Из МассивПараметров Цикл
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "nonce");
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "opaque");
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "stale");
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "algorithm");
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "qop");
ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, "realm");
КонецЦикла;
nc = 1;
ПараметрыАутентификации.Вставить("uri", АдресСтраницы);
ПараметрыАутентификации.Вставить("nc", Формат(nc,"ЧЦ=8; ЧДЦ=; ЧВН=; ЧГ=0"));
ПараметрыАутентификации.Вставить("cnonce", НРег(СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "")));
Если ПараметрыАутентификации.Свойство("nonce") И ПараметрыАутентификации.Свойство("opaque") И ПараметрыАутентификации.Свойство("stale")
И ПараметрыАутентификации.Свойство("algorithm") И ПараметрыАутентификации.Свойство("qop") И ПараметрыАутентификации.Свойство("realm") Тогда
HA1 = ПолучитьХеш(Логин+":"+ПараметрыАутентификации.realm+":"+Пароль);
HA1 = ХексВСтроку(HA1);
HA2 = ПолучитьХеш(ВРег(ИмяМетода)+":"+АдресСтраницы);
HA2 = ХексВСтроку(HA2);
Если ПараметрыАутентификации.qop = "auth" Тогда
Response = ПолучитьХеш(HA1+":"+ПараметрыАутентификации.nonce+":"+ПараметрыАутентификации.nc+":"+ПараметрыАутентификации.cnonce+":"+ПараметрыАутентификации.qop+":"+HA2);
Иначе
Response = ПолучитьХеш(HA1+":"+ПараметрыАутентификации.nonce+":"+HA2);
КонецЕсли;
Response = ХексВСтроку(Response);
ПараметрыАутентификации.Вставить("response", Response);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("accept", "application/json");
DigestЗапрос = "Digest username="""+Логин+""", realm="""+ПараметрыАутентификации.realm+""", nonce="""+ПараметрыАутентификации.nonce;
DigestЗапрос = DigestЗапрос+""", uri="""+ПараметрыАутентификации.uri+""", qop="""+ПараметрыАутентификации.qop+""", nc="""+ПараметрыАутентификации.nc;
DigestЗапрос = DigestЗапрос+""", cnonce="""+ПараметрыАутентификации.cnonce+""", response="""+ПараметрыАутентификации.response+""", opaque="""+ПараметрыАутентификации.opaque+"""";
Заголовки.Вставить("Authorization", DigestЗапрос);
ЗаполнитьЗначенияСвойств(Заголовки, ПараметрыАутентификации);
HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
// обработка исключения
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьХеш(Текст)
ОбъектХеш = Новый ХешированиеДанных(ХешФункция.MD5);
ОбъектХеш.Добавить(Текст);
Возврат ОбъектХеш.ХешСумма;
КонецФункции
&НаКлиенте
Функция ХексВСтроку(Текст)
Возврат НРег(СтрЗаменить(Строка(Текст), " ", ""));
КонецФункции
&НаКлиенте
Процедура ДобавитьЗначениеИзСтрокиПараметраАутентификации(ПараметрыАутентификации, ТекПараметрСтрокой, ИмяПараметра)
Если НЕ СтрНайти(ТекПараметрСтрокой,ИмяПараметра) = 0 Тогда
ПараметрыАутентификации.Вставить(ИмяПараметра, СтрЗаменить(СтрЗаменить(СокрЛП(ТекПараметрСтрокой), ИмяПараметра + "=", ""),"""",""));
КонецЕсли;
КонецПроцедуры
Показать
Может ссылки есть на какие-то материалы, я чувствую что вообще не рублю в этих сервисах. Скорее всего по рабочему примеру сделал бы, но нашел только один источник на инфостарте, по размещению данных на ЕФРСБ, стоит 10 стартмани, низкий рейтинг и старая публикация.
ЕФРСБ на все вопросы посылают, программа svcutil с их примера при загрузке ws-ссылки выдает ошибку, нашел статью по мониторингу пакетов https://its.1c.ru/db/metod8dev/content/1939/hdoc, установил Wireshark, думал подсмотреть что отправляет запрос к web-сервису из кода 1С, пока не разобрался. Хелп!
2.
user646807_kazako.a911
1403.11.23 09:46 Сейчас в теме
Ответ: можно. https://infostart.ru/1c/articles/516653/ Посмотрел, что Boomerang отправлял в заголовках и теле запроса, сделал так же и взлетело. Шайтанмашина =)
В документации сервиса ща описана вторая версия, там нет WS - там HTTP-сервисы. И XML туда посылается base64-строкой с помощью определенных методов. Я про веб-сервисы даже описания там не нашел.
6.
user646807_kazako.a911
1403.11.23 15:06 Сейчас в теме
(3)
У них есть для сервиса ЕФРСБ wsdsl, когда добавил ws-ссылку в 1С, добавилось без ошибок.
Из этого сделал вывод, что можно использовать механизмы web-сервиса.
Методы использовать получилось с помощью http, но фабрика XDTO из сервиса не полностью раскладывает пакет в XDTO