Свой веб интерфейс к 1С: побеждаем CORS на IIS, сохраняя авторизацию

20.08.19

Администрирование - Администрирование веб-серверов

Если "веб морда" расположена не по тому же адресу, что и публикация 1С (что часто бывает, например, при разработке, публикация 1С на http://localhost/1c, а разрабатываемое веб-приложение на http://localhost:8080) или, например, мы заходим на веб приложение то по ip адресу, то по имени сервера, или просто веб сервер и сервер, на котором опубликована 1С - это разные сервера, то для большинства запросов от браузера к 1С срабатывает политика CORS, которая заключается в том, что браузер сначала посылает запрос OPTIONS, на который сервер должен ответить определенным образом, заголовками, содержащими разрешения, а потом уже (если разрешение есть), браузер посылает основной запрос. В случае, когда в публикации 1С (default.vrd) жестко прописан логин и пароль, разрулить ситуацию можно средствами 1С. В случае же, когда нужно сохранить авторизацию (или используется стандартный интерфейс odata), начинаются проблемы.

В консоли браузера в это время будет наблюдаться такая картина:

Что такое CORS и зачем он нужен, можно почитать здесь: https://habr.com/post/337146/.


Рассмотрим случай 1:

В default.vrd жестко указан пользователь. Тогда можно воспользоваться только средствами 1с. К каждому шаблону URL добавляем обработчик для HTTP метода OPTIONS

с примерно таким кодом:

Процедура ЗаполнитьЗаголовки(Запрос, Ответ)
	
	Origin = Запрос.Заголовки.Получить("Origin");
	Если Origin = Неопределено Тогда
		Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
	Иначе
		Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", Origin);
	КонецЕсли;	
	Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Authorization,Content-type");
	Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "GET, POST, PUT");// и какие там еще есть методы у данного шаблона запроса
	
КонецПроцедуры

Функция ШаблонOptions(Запрос)
	
	Ответ = Новый HTTPСервисОтвет(200);
	ЗаполнитьЗаголовки(Запрос, Ответ);
	Возврат Ответ;
	
КонецФункции

и все, теперь можно слать ajax запросы прямо из браузера к http сервисам 1с.

Теперь же рассмотрим случай 2:

у нас нет возможности управлять ответом 1с, например мы стучимся в стандартный интерфейс odata или у нас требуется авторизация, (на которую требуется разрешение на которое требуется авторизация...). В этом случае можно настроить IIS соответствующим образом. Для этого нужно сначала установить "установщик веб платформы" :) Для IIS. Кстати, полезная штука. Позволяет, например, быстро установить php так, что он работает из коробки. Для этого нужно пройти на сайт майкрософт и скачать оттуда дистрибутив. https://www.microsoft.com/ru-RU/download/details.aspx?id=6164. Почему это средство сразу не встроено в консоль управления IIS - не понятно. Очень сильно во многих случаях облегчает жизнь.

После установки запускаем Диспетчер служб IIS, теперь у нас появился новый пункт в настройках.

Запускаем его, в поиске вбиваем cors и получаем невзрачный результат:

Нажимаем "добавить, установить, принимаю, далее, далее, готово", получаем сообщение об успешной установке.

Теперь находим в дереве нашу публикацию, нажимаем на "Редактор конфигурации":

Заходим в раздел system.webServer/cors:

Затем в редакторе указываем enabled в true,

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

allowCredentials:true // это как раз разрешение на отправку логина и пароля, для авторизации в 1с.

allowed: true

allowHeaders->allowAllRequestedHeaders: true // можно разрешить заголовки клиента по списку, но особого применения в плане использования с 1с я не вижу

allowMethods: коллекция, добавляем в неё все используемые нами методы, например у меня в добавок к GET и POST используются PUT, LOCK и UNLOCK

и самое главное: origin: тут указываем то, что будет в строке браузера (до первого слеша, для инфостарта это //infostart.ru), при использовании нашего веб интерфейса. Например если мы разрабатываем фронт и используем вебпак с чем-то похожим на "npm run dev", то в большинстве случаев тут будет http://localhost:8080.

 

Повторяем для всех адресов origin, которые могут использоваться. К сожалению, использовать wildcard * для запросов с именами авторизацией (где передаются имена пользователей и пароли) нельзя. После этого не забываем нажать на "Применить" в правом верхнем углу и все, должно заработать. Однако, если мы имеем случай 1 из данной статьи (жестко забитый в default.vrd пользователь 1с), то вместо конкретного origin можно указать * и все будет работать.

Надеюсь, эта статья будет полезна.

Инструкция Администрирование IIS веб-интерфейс SPA CORS веб сервисы odata

См. также

Путь самурая. Ставим локальный Сервер взаимодействия

Сервера Администрирование веб-серверов Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подробная пошаговая инструкция (как делал я) установки Сервера взаимодействия версия 22.0.26 на Windows Server 2022. Установка собственного объектного хранилище с помощью системы MinIO (https://min.io/). Настройка Сервера взаимодействия для обмена файлами в сообщениях.

1 стартмани

07.04.2023    12331    VPanin56    40    

71

Публикатор 1С. Как публиковать базы с комфортом

Администрирование веб-серверов Платформа 1С v8.3 Бесплатно (free)

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

20.03.2023    6615    71    Segate    4    

26

Midnight Commander, установленный с Entware, не выполняет команды и не запускает файлы

Администрирование веб-серверов Linux Бесплатно (free)

Столкнулся с проблемой, установил на роутер Midnigt Commander с репозитория Entware, при попытке выполнения команды программа пишет ошибку "The shell is already running a command". Данная публикация описывает способ решения этой проблемы.

20.03.2023    3356    Eugen-S    2    

3

Публикация 1С на Apache SSL в локальной среде разработки

Администрирование веб-серверов Платформа 1С v8.3 Бесплатно (free)

В статье описывается установка и настройка веб-сервера Apache для работы с 1С через https.

09.02.2023    5229    lone_mayson    4    

41

Контейнер Docker для размещения публикации базы 1С на разных платформах

Администрирование веб-серверов Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

Появилась необходимость развернуть на одном хосте две публикации базы, но не на одной платформе, а на разных. Тут я расскажу, как это сделать для версии 8.3.22.1704.

02.02.2023    3318    Sney_Kice    1    

21

Быстрое конфигурирование серверов с Ansible

Администрирование веб-серверов Сервера Бесплатно (free)

Всю рутину по обновлению платформы, настройке веб-серверов и серверов хранилищ на всем парке серверов компании можно автоматизировать с помощью удобочитаемых YAML-скриптов Ansible. О том, как написать сценарии такой автоматизации, чтобы запускать их параллельно для группы серверов, на митапе «Инструменты автоматизации рутины в 1С-разработке» рассказал ведущий разработчик компании ПИК Digital Павел Комаров.

26.01.2023    4773    lopatrik    4    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Labotamy 20.08.19 13:12 Сейчас в теме
Спасибо! С Апачем все почти тривиально, а вот как решать в IIS ответа не встречал.
2. swenzik 20.08.19 14:34 Сейчас в теме
(1) примерно так же как в апаче, кладёшь в папку публикации web.config с содержимым
<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>
Показать

устанавливаемый модуль в IIS делает тоже самое, по сути это гуйный конфигуратор
Soloist; adhocprog; +2 Ответить
3. Fragster 1137 20.08.19 14:53 Сейчас в теме
(2) не совсем. customHeaders работает для случая 1 из статьи, но нет возможности использовать авторизацию для нескольких origin, например.
4. Labotamy 20.08.19 19:03 Сейчас в теме
(2)Access-Control-Allow вряд-ли полечит отсутствие options в odata
12. Sakh1CPRO 29.07.23 14:13 Сейчас в теме
(2)


Доброго дня, помогите разобраться, в файле публикации у меня прописано это:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="1С" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files (x86)\1cv8\8.3.21.1674\bin\wsisapi.dll" resourceType="Unspecified" preCondition="bitness32" />
</handlers>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<httpErrors errorMode="Detailed" />
</system.webServer>
</configuration>



-----------------------------------------------------

А при отправке запрос а на WEB сервер выходит ошибка:


Access to fetch at 'https://www.sakhpro.host:7777/KwiBOTwork/ru/hs/HTTPBot/sendFile?token=LHJ8676&file=https://w.forfun.com/fetch/74/74739e1770f31cdbfdde99cc0b2925d3.jpeg?&tel=79841390993' from origin 'https://helppc.pro' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
WhatsApp.js:10


GET https://www.sakhpro.host:7777/KwiBOTwork/ru/hs/HTTPBot/sendFile?token=LHJ8676&file=https://w.forfun.com/fetch/74/74739e1770f31cdbfdde99cc0b2925d3.jpeg?&tel=79841390993 net::ERR_FAILED
tstjs @ WhatsApp.js:10
onclick @ (индекс):74
WhatsApp.js:32 Error: TypeError: Failed to fetch
at tstjs (WhatsApp.js:10:5)
at HTMLButtonElement.onclick ((индекс):74:57)






Показать
5. Labotamy 20.08.19 22:45 Сейчас в теме
А пусть для Апача тоже тут полежит.
 RewriteEngine On                  
 RewriteCond %{REQUEST_METHOD} OPTIONS 
 RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]
adhocprog; vladimirmatancev; sorb; A_Max; Fragster; JohnyDeath; +6 Ответить
6. Yashazz 4707 21.08.19 11:13 Сейчас в теме
Ценно. Один раз методом тыка смог победить, спасибо за нормальное систематизированное описание.
7. vandalsvq 1535 05.10.19 14:59 Сейчас в теме
(0) в свое время немного писал по этому вопросу у себя в статье (кроссдоменные запросы). Потом тоже перешел к тому, что во все интерфейсы добавил Options. Про настройку IIS приходило в голову, но руки не доходили. Спасибо что описали. Полезная информация.
8. Feelthis 38 06.02.20 09:19 Сейчас в теме
Если для локальной разработки веб приложения использовать nginx, то можно заюзать nginx-proxy.
То есть при http запросах например на http://myapp/api1c/ - запросы будут проксироваться на 1с сервер: http://server-1c.local
Пример конфига:

upstream api_server {
server server-1c.local;
}

server {
listen 80;
root /home/sergey/www/myapp/dist;
index index.php index.html index.htm index.nginx-debian.html;
server_name myapp;

location / {
#try_files $uri $uri/ =404;
#try_files $uri $uri/ /index.html;
proxy_pass http://localhost:8080/;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}

location ~ /\.ht {
deny all;
}

location /api1c/ {
rewrite /api1c/(.*) /$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://server-1c.local;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_redirect off;
}

}
plazotronik; +1 Ответить
9. Fragster 1137 06.02.20 13:30 Сейчас в теме
(8) да, таким образом вы заставляете браузер думать, что он работает в пределах одного домена. Отдельно отмечу важность заголовка X-Forwarded-For для 1с (в конфиге упомянут).
10. dimasts 22 30.10.21 15:13 Сейчас в теме
Эта рекомендация не понятна. У меня кросплатформенные запросы идут от tilda.cc и в моём случае работает только полное написание с "https://"
и самое главное: origin: тут указываем то, что будет в строке браузера (до первого слеша, для инфостарта это //infostart.ru), при использовании нашего веб интерфейса. Например если мы разрабатываем фронт и используем вебпак с чем-то похожим на "npm run dev", то в большинстве случаев тут будет http://localhost:8080.
11. Fragster 1137 01.11.21 10:30 Сейчас в теме
(10) на просто редактор текста сожрал https: :)
Оставьте свое сообщение