Выставляем один из вебсервисов без авторизации, без второй публикации

20.04.15

Интеграция - WEB-интеграция

Иногда нужно отключить авторизацию на вебсервере для одного из вебсервисов (сделать его общедоступным), или в принципе выставить один вебсервис "наружу", оставив остальные доступными только из локальной сети.

Скачать файлы

Наименование Файл Версия Размер
soap-proxy.zip
.zip 0,83Kb
4
.zip 0,83Kb 4 Скачать

В принципе, задачу можно решить, создав руками вторую публикацию с нужными сервисами, но тогда приходится заморачиваться с настройками доступа для этой публикации.

Для себя я решил эту проблему с помощью универсального "прокси", который ставится на любой веб-сервер с установленным php с модулем curl, который перенаправляет входной поток запроса на внутренний сервер, параллельно подменяя имя пользователя и пароль.

Настройка сводится к замене переменных:

$_1c_user = '1c_user';
$_1c_pwd = '1c_password';
$_1c_addr = 'http://webserver/1c/ws/ws1.1cws';

$php_user = 'php_user';
$php_pwd = 'php_password';
$php_realm = 'php_realm';

на нужные значения. Скрипт также подменяет адрес сервиса в wsdl'е, полученном от 1с на свой, так что работа скрипта становится вообще прозрачной.

Естественно, у самого скрипта должен быть доступ к "основной" публикации 1с.

Совсем отключить авторизацию скрипта можно закомментировав строки с 11 по 16.

Файл в архиве, так как инфостарт не принимает файлы php

Сам текст скрипта, если у кого-то нет смартмани, чтобы его скачать:

<?php

$_1c_user = '1c_user';
$_1c_pwd = '1c_password';
$_1c_addr = 'http://webserver/1c/ws/ws1.1cws';

$php_user = 'php_user';
$php_pwd = 'php_password';
$php_realm = 'php_realm';

if (!isset($_SERVER['PHP_AUTH_USER']) || ($_SERVER['PHP_AUTH_USER'] !== $php_user) || ($_SERVER['PHP_AUTH_PW'] !== $php_pwd))
{
	header('WWW-Authenticate: Basic realm="'.$php_realm.'"');
	header('HTTP/1.0 401 Unauthorized');
	exit;
}

if (isset($_GET['wsdl'])) {
	$ch = curl_init($_1c_addr.'?wsdl');
} else {
	$ch = curl_init($_1c_addr);
	$post_data = file_get_contents('php://input');
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}

curl_setopt($ch, CURLOPT_USERPWD, $_1c_user.':'.$_1c_pwd);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);
$info = curl_getinfo($ch);
curl_close ($ch);

// подстановка "правильного" для внешнего мира адреса в wsdl
if (isset($_GET['wsdl'])) {
	$full_url = 
		($_SERVER['HTTPS']?'https://':'http://').
		$_SERVER['SERVER_NAME'].($_SERVER['HTTP_PORT']?':'.$_SERVER['HTTP_PORT']:'').
		$_SERVER['PHP_SELF'];
	$server_output = preg_replace('/(:address location=")(.*?)("\/>)/', '$1'.$full_url.'$3', $server_output);
}

header('Content-Type: '.$info["content_type"]);
file_put_contents('php://output', $server_output);
?>

soap веб-сервис авторизация прокси

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15661    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17429    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25688    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16260    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Makushimo 160 21.04.15 08:41 Сейчас в теме
Интересно.
Не понятно только куда этот скрипт подключать.
в каком месте всей инфраструктуры его ставить?
2. Fragster 1137 21.04.15 09:25 Сейчас в теме
(1) Makushimo, на тот сервер, на котором вы планируете опубликовать общедоступный сервис. Это может быть тот же сервер, на котором крутится публикация 1с, но не обязательно, главное, чтобы с него был доступ до того сервера, на котором публикация 1с.
Требования к серверу - php 5 с установленным модулем curl, ОС не важна.
3. Makushimo 160 21.04.15 09:50 Сейчас в теме
ничего не понял, но спасибо за ответ -))
4. Fragster 1137 21.04.15 10:52 Сейчас в теме
(3) Makushimo, ну, допустим, есть сервер с публикацией 1с и адресом 192.168.0.1 и веб-сервер с сайтом компании http://webserver.ru/ с внутренним адресом в локальной сети 192.168.0.2 и неважно каким внешним.

На вебсервере сайт лежит в папке /srv/www/site. Тогда мы кладем скрипт в эту папку и меняем в нем $_1c_user = 'имяпользователя1с', $_1c_pwd = 'паротльпользователя1с', $_1c_addr = 'http://192.168.0.1/путьдопубликации публикаци/ws/имясервиса.1cws'.

После этого при доступе извне по адресу http://webserver.ru/soap-proxy.php будет запрос логина и пароля, но не 1сных, а тех, которые прописаны в $php_user и $php_pwd. Как вообще отключить авторизацию - я уже написал в самой публикации.

WSDL будет по адресу http://webserver.ru/soap-proxy.php?wsdl

Плюсом такого подхода является то, что на вебсервере, доступном извне не нужно ставить устаревший апач 2.2, запрос авторизации никак не задействует 1с - т.е. не создает доп нагрузки на 1с "в случае чего", а также то, что мы можем одним движением выключить подобный доступ, или перенаправить на другой сервер, не заморачиваясь с "родной" публикацией 1с. Ну и к подобной авторизации что-нибудь типа fail2ban можно прикрутить, например, или еще какие службы, что в случае с 1с проблематично.
5. dmpas 417 21.04.15 11:57 Сейчас в теме
У меня всё работает из-коробки через SSH-туннели. Думаю, stunnel тоже может с таким справиться.
6. Fragster 1137 21.04.15 12:00 Сейчас в теме
(5) baton_pk, как ssh-туннели помогают _подменить_ авторизацию 1с?
7. dmpas 417 21.04.15 13:38 Сейчас в теме
(6)
хм. Слона-то я и не заметил. Извиняюсь.
8. planar74 23.04.15 16:16 Сейчас в теме
1. Каком смысл в подмене имени пользователя и пароля?
2. Чем проброс apache не устраивает?
9. Fragster 1137 23.04.15 18:55 Сейчас в теме
(8) planar74,
иногда есть требование не светить логин-пароль от 1с
иногда нужно выставить один из нескольких веб сервисов публично
иногда на публичном веб сервере есть требования к ПО и 1с там быть не должно (например это дешевый хостинг без возможности установки ПО).
иногда нужно отсечь "недобросовестных пользователей сети", которые брутфорсят пароли с помощью fail2ban
да и вообще можно придумать кучу вещей, которые можно сделать, вмешавшись в процесс авторизации, хоть направление запроса на разные базы в зависимости от имени пользователя и пароля.

и да, что такое "проброс от апач"? modrewrite?
10. planar74 24.04.15 09:59 Сейчас в теме
(9)
"иногда есть требование не светить логин-пароль от 1с" - то есть, если засветится пароль от прокси - злоумышленник не получит доступа к данным? Получит и еще как.
"и да, что такое "проброс от апач"? modrewrite?"

<VirtualHost *:*>
ServerName hostname.example.com
ProxyPreserveHost On
ProxyPass /freews http://192.168.111.2/base/ws/superpuper.1cws
ProxyPassReverse /freews http://192.168.111.2/base/ws/superpuper.1cws
RequestHeader set Authorization "Basic dXNlcjpwYXNzd29yZA=="
</VirtualHost>

Где dXNlcjpwYXNzd29yZA== user:password в кодировке base-64
Обращение к сервису http://hostname.example.com/freews?wsdl

З. Ы. Прикрепил файл с куском конфига
Прикрепленные файлы:
sample.txt
11. Fragster 1137 24.04.15 11:08 Сейчас в теме
(10) planar74, этот способ все запросы перенаправит, или я ошибаюсь? Нужен поддомен, получается.
12. planar74 24.04.15 12:52 Сейчас в теме
(11)
Все, которые поступят на http://hostname.example.com/freews?wsdl, остальные не тронет.
13. planar74 24.04.15 13:07 Сейчас в теме
(11)
А если по IP соединяться - можно так
<VirtualHost 192.168.1.1:*>
ProxyPreserveHost On
ProxyPass /freews http://192.168.111.2/base/ws/superpuper.1cws
ProxyPassReverse /freews http://192.168.111.2/base/ws/superpuper.1cws
RequestHeader set Authorization "Basic dXNlcjpwYXNzd29yZA=="
</VirtualHost>
14. Fragster 1137 25.02.16 11:31 Сейчас в теме
Нашлось еще одно применение - если менять $post_data с $server_output, то можно привести "несовместимые" с 1с сервисы в совместимый с 1с вид
15. Fragster 1137 03.03.22 10:43 Сейчас в теме
У кого загрузка курсов валют или какой другой информации была через soap с иностранных серверов и отвалилось - можно у себя на хостинге воспользоваться этой проксёй для обхода.
16. Defer4 04.10.22 12:00 Сейчас в теме
Добрый день! C http-сервисами можно подобное реализовать?
17. Fragster 1137 04.10.22 15:51 Сейчас в теме
(16) в смысле "подменять авторизацию на свою"? или просто пробрасывать? во втором случае хватает стандартных возможностей httpсервера , будь то nginx, apache или IIS. В случае подмены авторизации - уже нужен подход подобный используемому в статье, но, скорее всего, там нужно больше трансформаций запроса - метод, путь, заголовки и вот это всё.
18. Defer4 05.10.22 10:00 Сейчас в теме
(17) Просто задача нетривиальная, с одной стороны база находиться в сервисе 1с ГРМ, соответственно доступа к веб серверу и файлу публикации нет, с другой стороны Яндекс маркет отправляет POST запросы к опубликованному http-сервису, соответственно данные для авторизации в БД передать возможности нет. Вот и интересует возможность обращаться к http сервису с передачей данных авторизации через "прослойку"
19. Fragster 1137 05.10.22 15:30 Сейчас в теме
(18) если нужно просто добавить логин-пароль (которые на самом деле просто доп заголовок к запросу), то достаточно https://httpd.apache.org/docs/2.4/mod/mod_proxy.html + https://httpd.apache.org/docs/2.4/mod/mod_headers.html#requestheader
Оставьте свое сообщение