Эта документация описывает архитектуру созданной системы Single Sign-On (SSO) для сети сайтов con-med.ru. Система построена по принципу Identity Provider (IdP) и Service Provider (SP). 1. Общая архитектура Мастер-сервер (auth.con-med.ru): «Паспортный стол». Здесь хранятся все учетные записи, пароли и основные группы (специальности). Личный кабинет (id.con-med.ru): Основной интерфейс пользователя. Здесь происходит регистрация и редактирование профиля (данные транзитом улетают на мастер-сервер). Сайты-потребители (vebinar, content): Проверяют авторизацию через мастер-сервер. Сервер статистики (stat): Собирает логи действий пользователей со всех площадок. 2. Модуль сервера: conmed.authserver Где лежит: auth.con-med.ru → /local/modules/conmed.authserver/ Файловая структура: lib/api.php: Фасад системы, собирающий функционал из трейтов. lib/securitytrait.php: Валидация паролей, проверка ключей сайтов (хеши), Rate Limiting. lib/authtokentrait.php: Логика OAuth 2.0 (выдача кодов, токенов, Refresh токенов). lib/registrationtrait.php: Регистрация новых пользователей. lib/profiletrait.php: Обновление ФИО, города, телефона и мульти-специальностей. lib/groupstrait.php: Отдача списка специальностей (группы с C_SORT = 555). /api/oauth/: Точки входа для внешних запросов (user.php, token.php и т.д.). Ключевые особенности: Безопасность: Секретные ключи сайтов хранятся в виде BCRYPT-хешей. IDOR Protection: Пользователь может менять только свой профиль (проверка по Access Token). Агент: Раз в сутки запускается Api::cleanLogsAgent() для очистки старых логов. 3. Модуль клиента: conmed.sso Где лежит: Все сайты, кроме auth → /local/modules/conmed.sso/ Файловая структура: lib/auth.php: Основной класс. Реализует метод Authorize() (вход по коду) и AuthorizeByToken(). lib/interceptor.php: «Тихий страж». На событии OnProlog проверяет наличие куки CONMED_REFRESH. Если сессия Битрикса истекла, он незаметно обновляет её через сервер. lib/helper.php: Синхронизация групп (сопоставление по STRING_ID). /ajax/sso_handler.php: Единственный прокси-файл для всех AJAX-запросов фронтенда. Использует локальное кеширование специальностей (24ч). Компоненты: conmed:sso.auth: Модальное окно входа и регистрации. conmed:sso.profile: Личный кабинет с табами, мульти-выбором специальностей, поиском и списком дипломов. 4. Инструкции по эксплуатации Как добавить новый сайт в систему На сервере auth в настройках модуля conmed.authserver добавьте строку: ID_САЙТА : ЛЮБОЙ_ПАРОЛЬ : https://domain.ru Нажмите «Сохранить» (пароль превратится в хеш). Скопируйте папку модуля conmed.sso на новый сайт. Установите модуль в админке нового сайта. В настройках модуля введите ID_САЙТА и тот самый ПАРОЛЬ. Подключите компонент conmed:sso.auth в футере шаблона. Как добавить новую специальность На сервере auth создайте группу пользователей. Установите ей Сортировку = 555. Обязательно задайте Символьный идентификатор (латиницей). Список на всех сайтах обновится автоматически (в течение 24 часов из-за кеша или мгновенно после его очистки). Как работает связка пользователей Система ищет совпадения в следующем порядке: XML_ID (равен ID на сервере auth). Если не нашли — LOGIN (для склейки старых записей). Если не нашли — EMAIL. Это гарантирует отсутствие дублей даже при переносе старой базы 200к+ пользователей. 5. Технический журнал (Где смотреть логи) Мастер-сервер: HL-блок SsoAudit (успешные действия) и SsoSecurityLog (ошибки/атаки). Сайт ID: Файл /sso_final.log (отладка входа) и /sso_client_debug.log (отладка прокси). Дипломы: HL-блок UserDiplomas на сайте id.con-med.ru. 6. TODO (План развития) Сайт статистики: Разместить на stat.con-med.ru HL-блок и файл-приемщик для функции sendStatToHub. Email-уведомления: Настроить на сервере auth почтовые события, чтобы при смене пароля или регистрации через API пользователю уходило письмо. Webhook удаления: Добавить логику: если пользователь удаляется на auth, отправлять запрос на id для блокировки локальной записи. Синхронизация Аватаров: Добавить в API передачу PERSONAL_PHOTO через base64 или прямую ссылку. Массовая миграция: Запустить /local/tools/diplom_import.php для переноса оставшихся 200 000 дипломов (рекомендуется делать пачками по ночам). Документация актуальна на февраль 2026 года.