Процесс предназначен для безопасного создания, изменения и проверки внешних пользователей через REST API. Он интегрируется с внешними системами (например, CRM, порталы управления доступом) и обеспечивает:
🔐 Процесс использует механизм авторизации по
API KeyилиBearer Token.
servicePOSTОсновная точка входа — функция servicePOST(Запрос) из модуля модуль http-сервисов RestApi.txt.
Если ИмяМетода = "change_user" Тогда
Ответ = RestAPI_Методы.ИзменитьВнешнегоПользователя(Запрос);
ИначеЕсли ИмяМетода = "creat_user" Тогда
Ответ = RestAPI_Методы.СоздатьВнешнегоПользователя(Запрос);
...
Метод (ИмяМетода) | Назначение |
|---|---|
creat_user | Создание нового пользователя |
change_user | Изменение данных существующего пользователя |
alarm | Отправка уведомления о проблеме |
Перед обработкой выполняется проверка подлинности:
РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос,,,Истина);
Authorization.Истина — расширенные права).❌ Если проверка не пройдена — возвращается код
405 Method Not Allowed.
Тело запроса (в формате JSON) преобразуется в структуру:
ДанныеИзJSON = RestAPI_Методы.JSONВСтруктуру(Запрос.ТелоКакСтрока());
{
"user_id_ib": "4a9fb0fc-5b19-4d2b-80f3-123456789abc",
"email": "ivanov@company.ru",
"ФИО": "Иванов Иван Иванович",
"access_allowed": true,
"invalid": false,
"password_hash": "sha256:abc123...",
"КонтрагентGUID": "e8f7c5d1-2a3b-4c5d-8e9f-1234567890ab"
}
change_user)Вызывается:
Дев_СервисыСервер.ИзменитьВнешнегоПользователя(Результат, Отказ, ТекстОшибки)
user_id_ib находится запись в справочнике ВнешниеПользователи.ВнешнийПользователь.ПолучитьОбъект().Объект.Недействителен = Не Результат.access_allowed;
Объект.Логин = Результат.email;
Объект.Пароль = Результат.password_hash;
Записать().✅ Признак
Недействителенустанавливается на основеaccess_allowed.
creat_user)Вызывается:
Дев_СервисыСервер.ЗаписатьПользователей(Контрагент, МассивОтвета)
user_id_ib проверяется, существует ли уже пользователь.ВнешниеПользователи.ИдентификаторПользователя → user_id_ibЛогин → emailПароль → хешКонтрагент → связь с контрагентом (по GUID)ПользовательСервисов = ИстинаЗаписать().⚠️ Если пользователь уже существует — обновляются данные.
Перед созданием выполняется проверка доступного количества лицензий:
Если КоличествоЛицензий <= КоличествоПользователей Тогда
ТекстОшибки = "Количество лицензий не допускает подключать дополнительных пользователей.";
Возврат;
КонецЕсли;
✅ Это предотвращает превышение лимита активных пользователей.
Пользователь всегда привязывается к контрагенту:
Контрагент = Обмен.ПолучитьОбъектПоИдентификатору(Базаобмена, КонтрагентGUID);
ВнешнийПользователь.Контрагент = Контрагент;
🔗 Используется механизм
Обмен_ИдентификаторыОбменадля сопоставления внешнего GUID и ссылки в 1С.
После создания пользователя может быть сгенерирован API-ключ:
КлючАпи = СгенерированныйАпиКлючПользователя(ИмяПользователя, Гуид);
ТекстСообщения = ТекстСообщенияКлючаАпи(Ссылка, КлючАпи);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
APIКлючи.Все действия фиксируются в системе:
ЗаписьЖурналаРегистрации("REST_API_Users", УровеньЖурналаРегистрации.Информация, , , "Пользователь создан: " + email);
ЖурналАудитаСекретов.Добавить(
"APIKeyCreated",
Пользователь.Ссылка,
"Ключ выдан автоматически"
);
Все методы возвращают JSON:
{
"success": true,
"data": {
"UserID": "U-123",
"Status": "Updated"
},
"error": ""
}
или при ошибке:
{
"success": false,
"data": null,
"error": "User not found or invalid license count."
}
Формирование выполняется через:
ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Данные, Успешно, Ошибка);
Внешняя система
|
| POST /rest/service?ИмяМетода=creat_user
| { "user_id_ib": "...", "email": "..." }
↓
servicePOST()
|
| Проверка авторизации → ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации()
↓
| Парсинг JSON → JSONВСтруктуру()
↓
| Проверка лицензий
↓
| Поиск/создание пользователя → ВнешниеПользователи
↓
| Привязка к контрагенту (по GUID)
↓
| Запись объекта
↓
| Генерация API-ключа (опционально)
↓
| Аудит: Журнал регистрации + ЖурналАудитаСекретов
↓
| Формирование JSON-ответа
↓
Внешняя система
|
| 200 OK { "success": true, ... }
| Функция | Реализовано | Источник |
|---|---|---|
| Создание пользователя | ✅ | Дев_СервисыСервер.ЗаписатьПользователей() |
| Изменение пользователя | ✅ | Дев_СервисыСервер.ИзменитьВнешнегоПользователя() |
| Авторизация по токену | ✅ | ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации() |
| Проверка лицензий | ✅ | Внутри ЗаписатьПользователей() |
| Связь с контрагентом | ✅ | Через Обмен.ПолучитьОбъектПоИдентификатору() |
| Генерация API-ключа | ✅ | СгенерированныйАпиКлючПользователя() |
| Аудит операций | ✅ | ЖурналАудитаСекретов, ЗаписьЖурналаРегистрации |
| Отправка ключа по email | ✅ | СообщитьПользователю() |
| Направление | Рекомендация |
|---|---|
| Подтверждение email | Добавить этап верификации перед активацией. |
| История изменений | Вести журнал изменений реквизитов пользователя. |
| Ограничение по IP | Разрешать создание только с доверенных адресов. |
| Уведомления администратору | При создании — письмо ответственному. |
| Повторная выдача ключа | Реализовать метод regenerate_api_key. |
| Автоматическая деактивация | По истечении срока неактивности. |
| Риск | Описание | Решение |
|---|---|---|
Утечка user_id_ib | Может использоваться для подбора пользователей | Добавить CAPTCHA или ограничение по частоте |
| Превышение лицензий | Система перестанет принимать новых пользователей | Настроить оповещение при достижении 90% |
| Некорректный пароль | Хеш может быть битым | Проверять формат password_hash |
| Дублирование пользователей | Один user_id_ib — два пользователя | Убедиться, что ИдентификаторПользователя уникален |
Процесс полностью рабочий и безопасный. Он позволяет:
✅ Документ подготовлен так, чтобы новый программист мог:
- Понять полный жизненный цикл пользователя.
- Безопасно добавить новые функции.
- Интегрировать с другими сервисами.