Files

62 lines
6.7 KiB
Plaintext
Raw Permalink Normal View History

2026-03-06 19:26:11 +03:00
Эта документация описывает архитектуру созданной системы 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 года.