Skip to content

ADR-010: Саморегистрация клиентов

Status: Accepted · Date: 2026-07-04

Исходно клиентов создавал только админ; вход в кабинет — исключительно magic link, с обоснованием «пароль не добавляет защиты, но добавляет поддержку». Требование: самостоятельная регистрация через email+пароль или OAuth, три режима — открытый, по заявке, закрытый.

Саморегистрация меняет вводные исходного решения: клиент приходит сам, и magic-link-на-каждый-вход ставит каждый логин в зависимость от доставки email — для self-hosted-инсталляций с нулевой SMTP-репутацией это основной источник поддержки. Аргумент против пароля устарел вместе с контекстом.

  • Режим регистрации — конфигурация portal_auth.registration: closed (default) | application | open.
  • Клиенты получают опциональный пароль (password_hash nullable) и 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 и разный радиус поражения при утечке секрета; разделено по поверхностям.

  • (+) Ноль новых token-таблиц: magic_links покрывает верификацию и восстановление.
  • (+) ADR-009 не затронут: популяции по-прежнему раздельны, у клиентов собственная identity-таблица.
  • (−) Режим open требует анти-abuse: rate limit на регистрацию, очистка неподтверждённых за 24 ч; CAPTCHA — future по потребности.
  • (−) У клиентов появляется парольный контур поддержки, сведённый к magic link («забыли пароль» = вход по ссылке + смена пароля).