Отключить авторизацию для http сервиса 1с
Описанный метод позволяет обратиться к веб-сервисам 1С из html-страницы через JavaScript. В качестве примера выводится список справочников. При нажатии на любой справочник выводятся первые буквы наименований. При нажатии на букву выводятся данные с наименованиями, начинающимися на эту букву.
Способ применим для случаев, когда веб-сервис и html-страница опубликованы на одном сервере. В этом случае не возникает кросс-доменных проблем. Например, если домены будут отличаться, то Chrome выдаст ошибку:
Failed to load resource: Origin localhost:3299 is not allowed by Access-Control-Allow-Origin
Не вдаваясь в подробности публикации веб-сервисов, предположим, что на стороне 1С создан и опубликован веб-сервис catalogs с операцией Execute. На входе — параметр script типа string, на выходе тип string. Операция запускает на стороне произвольный код script из параметра и возвращает JSON-сериализацию от переменной result.
С JSON-сериализацией удобно работать средствами JavaScript и преобразовать строку в объект/массив одной командой eval(resultText). В Интернете можно найти несколько JSON-сериализаторов для 1С.
Удостоверимся, что веб-сервис отвечает, введя его адрес:
На форме сверху разместим элементы настройки веб-сервера: wsUrl — адрес веб-сервиса, wsUser — логин, wsPassword — пароль. На стороне веб-сервиса 1С включена basic autherization. Логин и пароль соответствуют пользователю, прописанному в 1С.
Левая панель отвечает за отображение доступных справочников catalogsList, правая — за отображение букв (letters) и данных (catalogRecords).
JavaScript
Функция обращения к SOAP веб-сервису определена следующим образом:
Получение списка наименований каталогов.
Получение первых букв наименований справочника
Получение данных для каталога , где первая буква входит в условие .
При нажатии на кнопку Обновить происходит вызов функции
и при успешном выполнении вызывается обработчик processSuccess
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Аналогично обрабатываются нажатия на все управляющие элементы. Нажатие на справочник очищает буквы и данные, перезаполняет буквы. Нажатие на букву перезаполняет данные из справочника. За обработку кода на 1С отвечают куски кода в script-блоках с типом «text/1c».
Приложение выглядит так:
Нерешенная проблема авторизации на браузере IE
Существует проблема авторизации на IE. На IE 8/9 не удалось решить проблему basic authorization аналогичным для остальных браузеров методом.
На IE Ajax не работает с использованием user/password — свойств $.ajax. На FF и Chrome все работает нормально. По какой-то причине на сервер в случае с IE не передается заголовок
Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==
Если кто-нибудь знает причину и как обойти, пожалуйста, напишите в комментариях.
Выводы
Предложенный подход на основе SOAP имеет право на существование для несложных задач, так как сопровождается достаточно большим числом JavaScript кода. Возможно, в будущем удастся создать JavaScript фреймворк для упрощения процесса создания приложений.
Разработчики в этом способе самостоятельно отвечают за безопасность. Необходимо проверять входные параметры при записи, не позволять запуск произвольных скриптов, переданных с клиента. В статье выполнение произвольного кода показано только для примера. Унифицировать можно выполнение произвольного запроса, но это связано с опасностью SQL-инъекций.
Внешние компоненты Native API от 1С не будут работать в данной среде. Это значит, что нужно дополнительно решать проблему с написанием драйверов для оборудования.
Есть сайт, на котором есть два поля - логин и пароль (в них вводятся данные учетки 1С). Нужно после ввода логина и пароля и нажатия кнопки ВХОД сделать редирект на адрес опубликованной базы и чтобы база открылась без окна авторизации.
Как правильно выполнить сие действие?
Простейшая веб форма для входа. Вставляешь свой адрес базы и оставляешь нужные параметры. При открытии нет запроса пользователя и пароля 1С.
(7) да, если просто открыть по ссылке - то все как обычно, окно авторизации (9) так дело не в том что пользователь увидит, а в том что не безопасно)))любой сниффер выловит это и получит логин и пароль (13) ну, пользователь теоретически сможет его подсмотреть. Правда для этого надо специфические инструменты применять. Например стандартные инструменты разработчика firefox сбрасывают сетевую панель при каждом редиректе и засечь заголовок 301 очень проблематично (1с сама делает редирект на url без логина пароля, так что получается цепочка редиректов сайт -> url с логином -> url без логина)
по сабжу - сайта как такового нет, есть хтмл страница где будут два поля логин пароль и кнопка вход
База же опубликована на веб-сервере. IIS? Он позволяет настроить LDAP аутентификацию. чуваки говорят что логин юзера в 1с должен быть привязан к учетке ОС. Ну и в IIS авторизация тем же самым Apache уже сложнее. Я только краем уха слышал про настройку LDAP-авторизации под апачем. Версия платформы какая?Есть стандартный вход через рест.
Простейшая веб форма для входа. Вставляешь свой адрес базы и оставляешь нужные параметры. При открытии нет запроса пользователя и пароля 1С.
(16) Сергей, спасибо, как будто то что надо.Однако в моем случае не взлетело. Сначала не хотело воспринимать zone - т.е. при нажатии кнопки ОК переходил к базе без разделителя. Я добавил значение разделителя к адресу. Теперь по кнопке ОК переходит к базе, но попадают на окно авторизации (даже пользователь не подставился). Причем в параметрах указываю русский, а попадаю на английский. Поэтому сделал вывод что все параметры формы авторизации просто игнорируются. С чем может быть связано? И где вы нашли такой вариант? На ИТС я не находил.
(19) Неее) Мне надо страницу, где будет два поля (логин и пароль), типа той что в (16). И чтобы по нажатию на кнопку ОК пользователя переадресовало в 1С, но уже без адинесного окна авторизации.
(20) Пользователей неизвестное количество
(21) ну так заменить окно ввода можно так:
<fo rm action="http://server/path/to/base/">
Пользователь: <input name="N" />
Пароль: <input type="password" value="" name="P"/>
</form>
при разделении данных добавляем <input type="hidden" value="значения разделителей" name="Z"/> (или не hidden, если пользователь сам должен вводить данные)
это проще, чем (16) и работает
(18) Не поверите, но на ИТС )) Правда не на диске, а онлайн.
Прямая ссылка, если есть доступ
ИТС онлайн
(25) не уверен что хороший ход. Первую строку не все браузеры обработают, вторая строка не скрывает поле полностью, остается наименование.
(24) Попробуй первую строку написать так:
А строку с разделителем убрать вообще.
id - уникальный идентификатор для формы
name - имя передаваемого параметра в post запросе
Порядок передачи параметров вроде бы не важен, уже компоновал разные.
Не уверен на 100%, так как разделители не использую
Я сразу спросил про версию платформы, потому что постепенно поправляют глюки.
На 8.3.9 у меня почему то не срабатывает код локализации сеанса. Язык интерфейса меняется нормально, но сеанс запускается только на языке по умолчанию определенном в конфигураторе (( Пароль пользователя 1С хранится в 8.х не в том же самом виде, что набирает пользователь, а в зашифрованном. Это раз.
А два - посмотрите механизм работы сервисов 1С-Контрагент или 1С-Отчеттность. Пароли на вход хранятся там отдельные, записаннные в регистры сведений, а доступ к web-сервису задействован через регистр сведений "Кэш программных интерфейсов" и в нем много чего интересного хранится.
Вдруг поможет. Коллеги, всем спасибо за помощь. Я не увидел что надо добавить e1cib/start. Все заработало)))
Именно то что я и хотел)
Коллеги, вопрос в продолжение (наверно больше тем, кто в HTML понимает). Добавил еще 10 в качестве вознаграждения.
Как сделать так, чтобы было всего два поля Логин и Пароль, но чтобы значения поля Логин также использовалось как значение для Zone?
Суть - используется разделение данных и разделитель для пользователя равен его логину.
при изменении usr поменяется значение в zone
(32) а могли бы поделится?)) или хотя бы в общих чертах рассказать?
(34) спасибо! там много полезной информации)))
К сожалению пока не получается сделать "красиво". Еще в поиске.
(36)
1. т.е. проблема как раз вернуть эту самую строку "https://домен/имябазы/e1cib/start" с параметрами подключения на клиент (т.е. в браузер), чтобы пост запрос выполнился в браузере и произошел переход в 1С?
(36) нашел еще один вариант, не знаю насколько красивый и безопасный.
1. выполняем пост запрос, передаем в 1С логин-пароль, выполняем в 1С все проверки
2. в случае успешной проверки возвращаем в браузер html вида
в таком случае при получении такого html в качестве ответа будет автоматически выполнен POST.
Единственно, что беспокоит это появление выполнение html где в коде явно прописан логин пароль. хотя с другой стороны, в этот же самый html пользователь и так вбивает свои данные.
При обращении, например через браузер, к веб-сервисам опубликованной базы 1С с настройками по умолчанию, будет всегда выходить окно для авторизации к базе 1С. Чаще всего это окно авторизации не нужно, и его необходимо убрать. Покажу один из способов, как это можно сделать. Необходимо найти и открыть файл default.vrd, который находится в каталоге, указанном для публикации базы 1С. Структура данного файла имеет следующий вид:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/ИмяБД"
ib="Srvr="ИмяСервера:ПортСервера";Ref="ИмяБД";"
enableStandardOData="true">
<ws>
<point name="ИмяВебСервиса"
alias="ИмяВебСервиса.1cws"
enable="true"/>
</ws>
</point>
Необходимо отредактировать данный файл. Важно: если для редактирования данного файла воспользоваться обычным редактором Notepad, то эти изменения скорее всего правильно сохранить не получиться, по причине неправильной кодировки. Но можно воспользоваться Notepad++. Открываем файл и добавляем в строке
свои данные для авторизации, то есть указываем пользователя БД и его пароль. В итоге структура данного файла примет следующий вид:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/ИмяБД"
ib color: rgb(0, 0, 255);"> ПарольПользователяБД";"
enableStandardOData="true">
<ws>
<point name="ИмяВебСервиса"
alias="ИмяВебСервиса.1cws"
enable="true"/>
</ws>
</point>
Если использование веб-сервисов предполагается только определенному кругу пользователей, тогда необходимо настроить доступ к веб-серверу только по определнным IP-адресам.
Началось все с вопроса "А можно ли сделать так чтобы любой желающий мог получить доступ к нашему веб-клиенту, и для этого не нужно было бы всех заводить руками?". А дальше начались поиски решения) Задача стояла весьма увлекательная. Я, как человек мельком знакомый с веб-разработкой, и по основному профилю специализирующийся на разработке в 1С, видел свет в конце туннеля, но короткого пути не знал) Для решения моей задачи я обратился в интернет. Результатом поисков, проб и ошибок, стало такое решение.
Тестировалось все на
1. 1С 8.3.8 и 1С 8.3.13, но думаю будет работать и на других релизах 8.3
1. Универсальная форма для входа и регистрации в базе 1С. При логине пользователь не видит стандартного окна аутентификации 1С
3. Восстановление пароля пользователя 1С из веб-формы
4. При регистрации и восстановлении пароля пользователь получает письма с паролями
Для тех кому интересны мытарства с разворачиванием веб-сервера и публикацией, смотрим под катДля простоты разворачивания демонстрационной базы будем использовать Apache, великий и могучий. Он прост и понятен в настройке, для наших целей, это его главное преимущество перед всевозможными проблемами IIS.
После этого по экрану побегут строки, для нас главное увидеть, что везде написано Success и не написано Error. Как правило установка сервиса проходит успешно, и ошибки в основном происходят в момент ее тестового запуска. Если увидели ошибки, то как правило все они хорошо гуглятся и быстро решаются.
После того как установка прошла успешно желательно зайти в папку Apache\bin в проводнике и запустить ApacheMonitor. Для того чтобы в трее появился интерфейс быстрого управления службой Apache.
Для того чтобы потом удалить Apache нужно тоже зайти в консоль, выполнить то же самое. но с ключом -k uninstall
8. После установки Apache нужно установить модуль расширения web-сервера 1С. Для этого зайдите в список установленных приложений, выберите 1С, и нажмите "Изменить", после в диалоге установки выберите в списке прочего "Модуль расширения web-сервиса"
9. Установка окружения завершена. Остался только сам процесс публикации, который выполняется в пару кликов. Описывать не буду, надеюсь рядовой одинесник без труда с этим разберется. на этом все.
Архитектура решения такова:
Нам остается только подставить правильный адрес в атрибут action нашей формы. И готово.
С остальными функциями веб-формы логина все не так просто.
Хочется переделать на CURL для расширенной работы с ответом веб-сервиса, и переделать вызовы на AJAX. Но пока так.
3. Следующим по очереди идет файл config.php в папке assets, в нем указаны конфигурационные данные для подключения к нашему веб-сервису. код прост и незатейлив. Но сильно упрощает подключение.
из этого файла выбираются параметры для всех операций
4. и style.css, но это не так интересно. Стили здесь не главное.
Дальше переходим к стороне 1С.
/register и /resetPassword
Оба шаблона содержат POST-методы и устроены однообразно
Листинг функции регистрации в упрощенном виде выглядит так
Листинг функции восстановления пароля устроен подобным образом
Для тех кто станет это скачивать и пробовать. Нужно сделать следующее
1. .Заполнить параметры подключения к почтовому серверу в процедуре ПочтовыйПрофиль(), тогда почта начнет отправляться.
Читайте также: