Web-сервис 1С без авторизации

Все чаще интеграции со сторонними сервисами требуют использование  WebHook. Использовать данный метод в 1С позволяет публикация http-сервиса. И кажется, что задача решена, но в самый последний момент возникает трудность — авторизация пользователя. Пока 1С не научилась публиковать отдельные http-сервисы — без авторизации. В сети есть несколько решений данного вопроса:

Самый распространенный — добавить авторизацию в файл публикации на IISdefault.vrd. Данное решение имеет определенный недостаток — все пользователи которые попробуют открыть эту публикацию — будут авторизованы под заданным пользователем, что не есть хорошо.

Другой метод — это в ссылку WebHook вписать данные логин и пароль в формате: https://<Логин>:<Пароль>@<ссылка на сервис>. Но тогда Вы передаете эти данные открыто в сторонний сервис.

Есть несколько решений с анонимной авторизацией на определенные http-сервисы, но все решения актуальный для публикаций через Web-сервер Apache, а это не наш случай.

Ну и один из самых удачных способов — использовать web-сервер Nginx — как обратный proxy, который будет добавлять необходимый заголовок базовой авторизации в запросы.

Принцип данного способа в следующем: Мы устанавливаем URL для входящих запросов — опубликованный адрес и порт на нашем nginx. Далее во все запросы приходящие на этот web-сервер мы добавляем заголовок с авторизацией и перенаправляем на опубликованный http-сервис 1С.

web-Authorization

От слов к практике:

Предположим некий сторонний сервис отправляет нам запросы на адрес youdomain.com. Используя протокол HTTPS с шифрованием — порт по умолчанию 443.

Первым делом скачаем nginx,  распакуем в папку из которой данный сервер будет исполняться и создадим несколько .bat файлов в этой папке для его запуска, остановки и перезапуска.

Файл startNginx.bat
@echo off
<путь в папку с исполняемым файлом>\nginx.exe
Файл stopNginx.bat
@echo off
<путь в папку с исполняемым файлом>\nginx.exe -s quit
Файл reloadNginx.bat
@echo off
<путь в папку с исполняемым файлом>\nginx.exe -s reload

Далее настроим файл конфигурации nginx.conf который лежит в папке conf в распакованной папке с исполняемым файлом. Все особенности настройки вы можете прочитать в документации к Nginx.

Файл nginx.conf

worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# HTTPS server

server {
listen 444 ssl;
server_name youdomain.com;

ssl_certificate «SSLchain.crt»;
ssl_certificate_key «key.txt»;

location /crm/hs/um {
proxy_pass <URL you public base 1C>;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization «Basic <Code Authorization>»;
proxy_pass_header Authorization;
}
ssl_prefer_server_ciphers on;
}
}

На что стоит обратить внимание:

  • «listen 444 ssl;» — порт который будет слушать nginx. На этот порт нужно настроить webHook;
  • «server_name youdomain.com;» — доменное имя по которому разрешается Ваш сервер;
  • «ssl_certificate «SSLchain.crt»;» — путь к цепочке SSL сертификата. Указать только конечный сертификат для nginx недостаточно. Как собрать цепочку описано тут. Простым языком, нужно открыть сертификат с блокноте и добавить в него в нужном порядке корневой и промежуточные сертификаты;
  • «ssl_certificate_key «key.txt»;» — путь к закрытому ключу SSL сертификата;
  • «proxy_set_header Authorization «Basic <Code Authorization>»;» — вместо <Code Authorization> — нужно указать комбинацию Login:Password  закодированную в base64. Об этом можно почитать тут.

После успешной настройки — стартуем web-сервер nginx и проверяем работу. Если отправить запрос на порт который слушает сервер, то запрос с заголовком авторизации будет транслирован на публикацию.

Ну и в завершение, что бы было совсем красиво, запускаем nginx как службу windows. Как это сделать описано например тут или тут.  Оставлю только xml файл с конфигурацией службы.

xml-файл конфигурации службы nginx

<service>
<id>Nginx</id>
<name>Nginx 1.6.3</name>
<description>This service runs Nginx continuous integration system.</description>
<startmode>Automatic</startmode>
<env name=»HOME» value=»C:/nginx-1.20.2″/>
<executable>%HOME%/nginx.exe</executable>
<startargument>-p%HOME%</startargument>
<stopargument>-s</stopargument>
<stopargument>stop</stopargument>
<logmode>rotate</logmode>
<logpath>srvlogs</logpath>

</service>

Write a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Close