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

20.04.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
soap-proxy.zip
.zip 0,83Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

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

Для себя я решил эту проблему с помощью универсального "прокси", который ставится на любой веб-сервер с установленным 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 веб-сервис авторизация прокси

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    4619    5    0    

12

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35943    71    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    3377    3    3    

5

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19759    26    24    

22

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1430    9    2    

11

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    5668    5    2    

6

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

Решение осуществляет синхронизацию задач Битрикс24 и 1С, что позволяет в одной системе ставить задачи, контролировать выполнение всего пула задач с группировкой по ответственным и проектам, формировать управленческие отчеты по работе сотрудников (загрузка, просроченные задачи), уведомлять сотрудников о ходе выполнения задач посредством чат-бот Telegram

7200 руб.

04.05.2021    21356    14    19    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Makushimo 160 21.04.15 08:41 Сейчас в теме
Интересно.
Не понятно только куда этот скрипт подключать.
в каком месте всей инфраструктуры его ставить?
2. Fragster 1157 21.04.15 09:25 Сейчас в теме
(1) Makushimo, на тот сервер, на котором вы планируете опубликовать общедоступный сервис. Это может быть тот же сервер, на котором крутится публикация 1с, но не обязательно, главное, чтобы с него был доступ до того сервера, на котором публикация 1с.
Требования к серверу - php 5 с установленным модулем curl, ОС не важна.
3. Makushimo 160 21.04.15 09:50 Сейчас в теме
ничего не понял, но спасибо за ответ -))
4. Fragster 1157 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 418 21.04.15 11:57 Сейчас в теме
У меня всё работает из-коробки через SSH-туннели. Думаю, stunnel тоже может с таким справиться.
6. Fragster 1157 21.04.15 12:00 Сейчас в теме
(5) baton_pk, как ssh-туннели помогают _подменить_ авторизацию 1с?
7. dmpas 418 21.04.15 13:38 Сейчас в теме
(6)
хм. Слона-то я и не заметил. Извиняюсь.
8. planar74 23.04.15 16:16 Сейчас в теме
1. Каком смысл в подмене имени пользователя и пароля?
2. Чем проброс apache не устраивает?
9. Fragster 1157 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 1157 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 1157 25.02.16 11:31 Сейчас в теме
Нашлось еще одно применение - если менять $post_data с $server_output, то можно привести "несовместимые" с 1с сервисы в совместимый с 1с вид
15. Fragster 1157 03.03.22 10:43 Сейчас в теме
У кого загрузка курсов валют или какой другой информации была через soap с иностранных серверов и отвалилось - можно у себя на хостинге воспользоваться этой проксёй для обхода.
16. Defer4 04.10.22 12:00 Сейчас в теме
Добрый день! C http-сервисами можно подобное реализовать?
17. Fragster 1157 04.10.22 15:51 Сейчас в теме
(16) в смысле "подменять авторизацию на свою"? или просто пробрасывать? во втором случае хватает стандартных возможностей httpсервера , будь то nginx, apache или IIS. В случае подмены авторизации - уже нужен подход подобный используемому в статье, но, скорее всего, там нужно больше трансформаций запроса - метод, путь, заголовки и вот это всё.
18. Defer4 05.10.22 10:00 Сейчас в теме
(17) Просто задача нетривиальная, с одной стороны база находиться в сервисе 1с ГРМ, соответственно доступа к веб серверу и файлу публикации нет, с другой стороны Яндекс маркет отправляет POST запросы к опубликованному http-сервису, соответственно данные для авторизации в БД передать возможности нет. Вот и интересует возможность обращаться к http сервису с передачей данных авторизации через "прослойку"
19. Fragster 1157 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
Оставьте свое сообщение