Публичные методы API (вторая публикация)
Часть методов REST API должна работать без входа пользователя: пользователь, забывший пароль, ещё не может войти. Это методы восстановления пароля и список логинов для страницы входа. Платформа проверяет логин и пароль раньше, чем начинает выполняться код 1С, поэтому «анонимного» адреса внутри основной публикации быть не может. Для таких методов создаётся вторая публикация той же информационной базы: в её строке подключения указан служебный пользователь с единственной ролью.
Принцип тот же, что в статье Установка оценок по заданию в личном кабинете: вторая публикация, в которой включён только нужный HTTP-сервис и прописан служебный пользователь.
Что доступно через вторую публикацию
Базовый адрес публичных методов:
<адрес второй публикации>/hs/api_public/v2/
Через вторую публикацию доступны только три маршрута:
| Метод | Адрес | Назначение |
|---|---|---|
POST | /v2/password-recovery-code | Запросить код восстановления пароля на электронную почту |
POST | /v2/password-recovery-confirm | Установить новый пароль по коду из письма |
GET | /v2/login-users | Получить список логинов для страницы входа |
Любые другие адреса и методы, а также запросы с параметрами в строке адреса (?...) получают ответ 404 без тела. Это ограничение действует независимо от прав служебного пользователя. Описание самих методов — в статье Публичные методы входа и восстановления пароля.
Выключатели в настройках ЛК
Методы восстановления пароля и список логинов по умолчанию выключены и включаются отдельными флажками в настройках личного кабинета. Подробнее — в статье Настройка восстановления пароля в личном кабинете.
Предварительные настройки
Прежде чем создавать вторую публикацию, убедитесь, что:
- информационная база уже опубликована на веб-сервере и работает (см. Публикация на сервере - Apache и Публикация на сервере IIS);
- вы работаете в программе с полными правами;
- установлена версия конфигурации, в которой есть публичные методы API.
Инструкция
Шаг 1: создайте служебного пользователя с единственной ролью
Служебный пользователь нужен только публикации: клиенты ЛК под ним не работают и пароль не вводят. Вся его «сила» — единственная роль Публичные методы API (ПубличныеМетодыAPI): она даёт право вызывать публичный HTTP-сервис APIПубличный и ничего больше.
-
Создайте профиль группы доступа.
Путь: Администрирование → Настройки пользователей и прав → Профили групп доступа
Назовите профиль, например, «Публичные методы API» и добавьте в него единственную роль — Публичные методы API.
-
Создайте группу доступа с этим профилем.
Путь: Администрирование → Настройки пользователей и прав → Группы доступа
-
Создайте пользователя, например
ApiPublic: включите флажок Аутентификация 1С:Предприятия и задайте надёжный пароль. Добавьте пользователя в созданную группу доступа. В примере файла публикации ниже указано условное значение пароля. -
В карточке пользователя снимите флажок Показывать в списке выбора: служебной учётной записи не место в списке логинов страницы входа.
-
Проверьте права пользователя: других ролей быть не должно. Публичные методы выполняются с правами служебного пользователя, поэтому каждая лишняя роль (например, Полные права или Базовые права API) ослабляет защиту второй публикации, которая открыта без входа.
Подробнее о создании профилей, групп и пользователей — в статье Создание групп и профилей доступа.
Шаг 2: создайте вторую публикацию на веб-сервере
Ниже в примерах вторая публикация называется it-public, а основная — itdemo. Подставьте свои имена и пути.
Веб-сервер Apache
-
Откройте файл
httpd.conf(в XAMPP —C:\xampp\apache\conf\httpd.conf), найдите блок публикации основной базы и скопируйте его ниже:# 1c publicationAlias "/itdemo" "D:/www/ITDemo/"<Directory "D:/www/ITDemo/">AllowOverride AllOptions NoneOrder allow,denyAllow from allSetHandler 1c-applicationManagedApplicationDescriptor "D:/www/ITDemo/default.vrd"</Directory> -
В копии замените имя публикации и пути:
# 1c publication publicAlias "/it-public" "D:/www/ITPublic/"<Directory "D:/www/ITPublic/">AllowOverride AllOptions NoneOrder allow,denyAllow from allSetHandler 1c-applicationManagedApplicationDescriptor "D:/www/ITPublic/default.vrd"</Directory> -
Создайте каталог
D:\www\ITPublicи скопируйте в него файлdefault.vrdиз каталога основной публикации. Откройте его и приведите к такому виду:<?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="/it-public"ib="File="D:\Рабочие базы\IT_Демо";Usr="ApiPublic";Pwd="ПарольСлужебногоПользователя";"><httpServices><service name="APIПубличный"rootUrl="api_public"enable="true"/></httpServices></point>Для серверной базы строка подключения выглядит так:
ib="Srvr="АДРЕС_СЕРВЕРА";Ref="НАЗВАНИЕ_БАЗЫ";Usr="ApiPublic";Pwd="ПарольСлужебногоПользователя";" -
Перезапустите Apache.
Веб-сервер IIS
- В каталоге
c:\inetpub\wwwroot\создайте каталогit-publicи скопируйте в него файлыdefault.vrdиweb.configиз каталога основной публикации. - Приведите
default.vrdк виду, показанному выше для Apache: вbaseукажите/it-public, в строку подключения добавьте служебного пользователя, вhttpServicesоставьте единственный сервисAPIПубличныйсrootUrl="api_public". - Настройте доступ учётной записи пула приложений к файлам публикации с учётом конфигурации вашего IIS. Не выдавайте полные права на каталог по умолчанию: содержащий пароль
default.vrdдолжен быть защищён от изменения посторонними пользователями. - В «Диспетчере служб IIS» раскройте ветку «Default Web Site», в контекстном меню папки
it-publicвыберите «Преобразовать в приложение» — так же, как показано в статье Установка оценок по заданию в личном кабинете. - Перезапустите веб-сервер.
Что нельзя переносить в файл второй публикации
Во второй публикации должен быть опубликован только сервис APIПубличный. Блок веб-сервисов <ws>, остальные HTTP-сервисы и стандартный интерфейс OData переносить не нужно: вторая публикация открыта без входа, и каждый лишний сервис расширяет возможности анонимных клиентов.
Шаг 3: проверьте публикацию
Подставьте свой адрес вместо https://server/it-public.
-
Проверьте, что закрыто всё лишнее. Запрос
GET https://server/it-public/hs/api_public/v2/echoдолжен вернуть404без тела. -
Проверьте список логинов. Запрос
GET https://server/it-public/hs/api_public/v2/login-usersвернёт[]— пока выключатель Показывать список логинов через API выключен или подходящих пользователей нет. -
Проверьте восстановление пароля:
curl -X POST "https://server/it-public/hs/api_public/v2/password-recovery-code" \-H "Content-Type: application/json" \-d '{"login_or_email": "ivanov"}'Пока выключатель Разрешить восстановление пароля через API выключен, ответом будет
400с кодом ошибкиВосстановлениеПароля.Отключено. Когда выключатель включён, ответ —201и пустой объект{}независимо от того, существует ли пользователь.
Шаг 4: включите выключатели в настройках ЛК
Путь: Администрирование → Сервис → Настройки параметров учета → Личный кабинет
Включите нужные флажки (Разрешить восстановление пароля через API, Показывать список логинов через API) и нажмите Применить. Здесь же ссылка Настройки восстановления паролей открывает штатную форму параметров кода и письма. Подробности и предупреждения — в статье Настройка восстановления пароля в личном кабинете.
Настройки веб-части ЛК
Здесь описана только публикация на стороне 1С. Какие настройки веб-части ЛК нужны для обращения ко второй публикации, смотрите в документации к обновлению веб-части личного кабинета.
Рекомендации по безопасности
- Ограничьте частоту запросов к адресам
/hs/api_public/*на веб-сервере или обратном прокси, например по числу запросов в минуту с одного IP-адреса. Методы вызываются без входа, и программа не ограничивает число обращений с одного адреса: она лишь не позволяет получать код для одного пользователя чаще заданного интервала. - Публикуйте по HTTPS. По второй публикации передаются пароли и коды подтверждения.
- Защитите файл
default.vrd: в нём в открытом виде записан пароль служебного пользователя, поэтому право на чтение каталога публикации должно быть только у служебных учётных записей веб-сервера и администраторов. - Не расширяйте роль служебного пользователя и не используйте эту учётную запись для других целей.
- Основная публикация (
/hs/api/v2/) остаётся только для авторизованных пользователей. Те же методы там тоже доступны, но под обычной проверкой логина и пароля.
Если что-то не работает
| Что происходит | Возможная причина | Что сделать |
|---|---|---|
Все запросы, включая три разрешённых, возвращают 404 | Сервис не опубликован: в default.vrd нет блока httpServices, имя сервиса не APIПубличный, rootUrl не api_public, или веб-сервер не перезапущен | Сверьте файл с примером выше и перезапустите веб-сервер |
404 только для нужного метода | Неточный адрес или HTTP-метод, лишний слеш, в адрес добавлены параметры (?...) | Используйте точные адреса из таблицы выше без параметров |
| Ошибка аутентификации при обращении к публикации | В ib неверный логин или пароль служебного пользователя | Проверьте значения Usr и Pwd |
| Сообщение об отсутствии прав на сервис | Служебный пользователь не добавлен в группу доступа с ролью Публичные методы API | Проверьте профиль, группу доступа и участие пользователя в ней |
400 с кодом ВосстановлениеПароля.Отключено | Выключатель восстановления в настройках ЛК выключен | Включите его, см. шаг 4 |
Пустой список логинов [] | Выключатель списка выключен, нет подходящих пользователей либо более 300 пользователей ИБ имеют флажок списка и стандартную аутентификацию (до остальных отборов) | См. Настройка восстановления пароля в личном кабинете |