ADR-010: Саморегистрация клиентов
Status: Accepted · Date: 2026-07-04
Контекст
Section titled “Контекст”Исходно клиентов создавал только админ; вход в кабинет — исключительно magic link, с обоснованием «пароль не добавляет защиты, но добавляет поддержку». Требование: самостоятельная регистрация через email+пароль или OAuth, три режима — открытый, по заявке, закрытый.
Саморегистрация меняет вводные исходного решения: клиент приходит сам, и magic-link-на-каждый-вход ставит каждый логин в зависимость от доставки email — для self-hosted-инсталляций с нулевой SMTP-репутацией это основной источник поддержки. Аргумент против пароля устарел вместе с контекстом.
Решение
Section titled “Решение”- Режим регистрации — конфигурация
portal_auth.registration:closed(default) |application|open. - Клиенты получают опциональный пароль (
password_hashnullable) и OAuth-идентичности (client_oauth_identities, отдельная конфигурация провайдеров кабинета). - Magic link сохраняется как один механизм в трёх ролях: беспарольный вход, подтверждение email, восстановление забытого пароля. Отдельных флоу верификации и сброса нет.
- Заявка — не сущность: клиент в статусе
pending. Статусы:pending | active | rejected | disabled; гейт входа для всех методов:email_verified AND active.
См. Аутентификацию.
Отклонённые альтернативы
Section titled “Отклонённые альтернативы”Регистрация только через magic link — сохраняет исходную чистоту, но переносит зависимость от доставки email с редкого события (создание) на каждый вход; consumer-UX ожидает пароль/OAuth.
Отдельная таблица заявок — дублирует идентичность клиента и требует миграции «заявка → клиент» при одобрении; статус на клиенте выражает то же одним полем.
Режим регистрации в БД с UI-переключателем — та же логика, что в политике аутентификации: операционное решение уровня деплоя, UI-переключатель добавляет риск самолокаута и второй источник истины.
Общая OAuth-конфигурация админки и кабинета — разные redirect URI и разный радиус поражения при утечке секрета; разделено по поверхностям.
Последствия
Section titled “Последствия”- (+) Ноль новых token-таблиц:
magic_linksпокрывает верификацию и восстановление. - (+) ADR-009 не затронут: популяции по-прежнему раздельны, у клиентов собственная identity-таблица.
- (−) Режим
openтребует анти-abuse: rate limit на регистрацию, очистка неподтверждённых за 24 ч; CAPTCHA — future по потребности. - (−) У клиентов появляется парольный контур поддержки, сведённый к magic link («забыли пароль» = вход по ссылке + смена пароля).