CRM4DEV-799 - Получение подробных данных проблемы... СТАТУС
📄 Описание процесса: Создание и проверка пользователей
1. Общее назначение
Процесс предназначен для безопасного создания, изменения и проверки внешних пользователей через REST API. Он интегрируется с внешними системами (например, CRM, порталы управления доступом) и обеспечивает:
- Создание новых пользователей.
- Изменение существующих.
- Проверку прав доступа.
- Аудит операций.
- Синхронизацию с контрагентами.
🔐 Процесс использует механизм авторизации по
API KeyилиBearer Token.
2. Точка входа: servicePOST
Основная точка входа — функция servicePOST(Запрос) из модуля модуль http-сервисов RestApi.txt.
Если ИмяМетода = "change_user" Тогда
Ответ = RestAPI_Методы.ИзменитьВнешнегоПользователя(Запрос);
ИначеЕсли ИмяМетода = "creat_user" Тогда
Ответ = RestAPI_Методы.СоздатьВнешнегоПользователя(Запрос);
...
Поддерживаемые методы:
Метод (ИмяМетода) | Назначение |
|---|---|
creat_user | Создание нового пользователя |
change_user | Изменение данных существующего пользователя |
alarm | Отправка уведомления о проблеме |
3. Этап 1: Авторизация запроса
Перед обработкой выполняется проверка подлинности:
РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос,,,Истина);
Что проверяется:
- Наличие заголовка
Authorization. - Валидность токена или API-ключа.
- Принадлежность пользователя к системе.
- Наличие прав на выполнение операции (с флагом
Истина— расширенные права).
❌ Если проверка не пройдена — возвращается код
405 Method Not Allowed.
4. Этап 2: Десериализация JSON
Тело запроса (в формате 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"
}
5. Этап 3: Поиск или создание пользователя
🔹 Сценарий 1: Изменение пользователя (change_user)
Вызывается:
Дев_СервисыСервер.ИзменитьВнешнегоПользователя(Результат, Отказ, ТекстОшибки)
Алгоритм:
- По
user_id_ibнаходится запись в справочникеВнешниеПользователи. - Если найден:
- Получается объект:
ВнешнийПользователь.ПолучитьОбъект(). - Обновляются реквизиты:
Объект.Недействителен = Не Результат.access_allowed; Объект.Логин = Результат.email; Объект.Пароль = Результат.password_hash; - Выполняется
Записать().
- Получается объект:
✅ Признак
Недействителенустанавливается на основеaccess_allowed.
🔹 Сценарий 2: Создание пользователя (creat_user)
Вызывается:
Дев_СервисыСервер.ЗаписатьПользователей(Контрагент, МассивОтвета)
Алгоритм:
- По
user_id_ibпроверяется, существует ли уже пользователь. - Если нет — создается новый элемент справочника
ВнешниеПользователи. - Заполняются реквизиты:
ИдентификаторПользователя→user_id_ibЛогин→emailПароль→ хешКонтрагент→ связь с контрагентом (по GUID)ПользовательСервисов = Истина
- Выполняется
Записать().
⚠️ Если пользователь уже существует — обновляются данные.
6. Этап 4: Проверка лицензий
Перед созданием выполняется проверка доступного количества лицензий:
Если КоличествоЛицензий <= КоличествоПользователей Тогда
ТекстОшибки = "Количество лицензий не допускает подключать дополнительных пользователей.";
Возврат;
КонецЕсли;
✅ Это предотвращает превышение лимита активных пользователей.
7. Этап 5: Связь с контрагентом
Пользователь всегда привязывается к контрагенту:
Контрагент = Обмен.ПолучитьОбъектПоИдентификатору(Базаобмена, КонтрагентGUID);
ВнешнийПользователь.Контрагент = Контрагент;
🔗 Используется механизм
Обмен_ИдентификаторыОбменадля сопоставления внешнего GUID и ссылки в 1С.
8. Этап 6: Генерация и отправка API-ключа (опционально)
После создания пользователя может быть сгенерирован API-ключ:
КлючАпи = СгенерированныйАпиКлючПользователя(ИмяПользователя, Гуид);
ТекстСообщения = ТекстСообщенияКлючаАпи(Ссылка, КлючАпи);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
- Ключ генерируется как случайная строка.
- Хранится в виде SHA-256 хеша в регистре
APIКлючи. - Отправляется пользователю по email.
9. Этап 7: Аудит и логирование
Все действия фиксируются в системе:
🔹 Журнал регистрации
ЗаписьЖурналаРегистрации("REST_API_Users", УровеньЖурналаРегистрации.Информация, , , "Пользователь создан: " + email);
🔹 Регистр аудита секретов
ЖурналАудитаСекретов.Добавить(
"APIKeyCreated",
Пользователь.Ссылка,
"Ключ выдан автоматически"
);
10. Формат ответа
Все методы возвращают JSON:
{
"success": true,
"data": {
"UserID": "U-123",
"Status": "Updated"
},
"error": ""
}
или при ошибке:
{
"success": false,
"data": null,
"error": "User not found or invalid license count."
}
Формирование выполняется через:
ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Данные, Успешно, Ошибка);
11. Диаграмма последовательности
Внешняя система
|
| POST /rest/service?ИмяМетода=creat_user
| { "user_id_ib": "...", "email": "..." }
↓
servicePOST()
|
| Проверка авторизации → ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации()
↓
| Парсинг JSON → JSONВСтруктуру()
↓
| Проверка лицензий
↓
| Поиск/создание пользователя → ВнешниеПользователи
↓
| Привязка к контрагенту (по GUID)
↓
| Запись объекта
↓
| Генерация API-ключа (опционально)
↓
| Аудит: Журнал регистрации + ЖурналАудитаСекретов
↓
| Формирование JSON-ответа
↓
Внешняя система
|
| 200 OK { "success": true, ... }
12. Что уже реализовано
| Функция | Реализовано | Источник |
|---|---|---|
| Создание пользователя | ✅ | Дев_СервисыСервер.ЗаписатьПользователей() |
| Изменение пользователя | ✅ | Дев_СервисыСервер.ИзменитьВнешнегоПользователя() |
| Авторизация по токену | ✅ | ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации() |
| Проверка лицензий | ✅ | Внутри ЗаписатьПользователей() |
| Связь с контрагентом | ✅ | Через Обмен.ПолучитьОбъектПоИдентификатору() |
| Генерация API-ключа | ✅ | СгенерированныйАпиКлючПользователя() |
| Аудит операций | ✅ | ЖурналАудитаСекретов, ЗаписьЖурналаРегистрации |
| Отправка ключа по email | ✅ | СообщитьПользователю() |
13. Рекомендации по доработке
| Направление | Рекомендация |
|---|---|
| Подтверждение email | Добавить этап верификации перед активацией. |
| История изменений | Вести журнал изменений реквизитов пользователя. |
| Ограничение по IP | Разрешать создание только с доверенных адресов. |
| Уведомления администратору | При создании — письмо ответственному. |
| Повторная выдача ключа | Реализовать метод regenerate_api_key. |
| Автоматическая деактивация | По истечении срока неактивности. |
14. Возможные проблемы и риски
| Риск | Описание | Решение |
|---|---|---|
Утечка user_id_ib | Может использоваться для подбора пользователей | Добавить CAPTCHA или ограничение по частоте |
| Превышение лицензий | Система перестанет принимать новых пользователей | Настроить оповещение при достижении 90% |
| Некорректный пароль | Хеш может быть битым | Проверять формат password_hash |
| Дублирование пользователей | Один user_id_ib — два пользователя | Убедиться, что ИдентификаторПользователя уникален |
15. Заключение
Процесс полностью рабочий и безопасный. Он позволяет:
- Автоматизировать управление пользователями.
- Интегрироваться с внешними системами.
- Контролировать доступ и лицензии.
✅ Документ подготовлен так, чтобы новый программист мог:
- Понять полный жизненный цикл пользователя.
- Безопасно добавить новые функции.
- Интегрировать с другими сервисами.