06 Authorization

Provisioning аккаунтов и onboarding пользователей

Provisioning аккаунтов и onboarding пользователей

Статус документа

Этот документ фиксирует первую рабочую модель завода пользователей в KSAILab после landed backend MR !10.

Она нужна для периода, когда:

  • Keycloak уже используется как IAM;
  • почта, внешние identity providers и self-service onboarding ещё не внедрены;
  • команде нужен быстрый и операционно понятный способ заводить преподавателей, группы и студентов;
  • frontend ещё догоняет новый backend contract, но backend onboarding endpoints уже существуют.

Связанные репозитории:

  • backend-ksailab
  • frontend-ksailab
  • keycloak-scripts-ksailab
  • docs-ksailab

Цель первой версии

Первая версия provisioning-инструмента должна решать три практические задачи:

  1. быстро создать учётку преподавателя;
  2. быстро создать одну или несколько учебных групп;
  3. быстро создать студентов и сразу назначить их в выбранную группу.

При этом архитектура не должна мешать будущему переходу на:

  • LDAP;
  • SSO;
  • federation через Keycloak;
  • более сложные enterprise onboarding-потоки.

Базовые решения

Кто заводит аккаунты

В первой версии provisioning выполняет только admin.

Это означает:

  • teacher не создаёт других teacher accounts;
  • teacher не заводит student accounts;
  • все первичные credential-операции централизованы и хорошо аудируются.

Важно не смешивать этот provisioning path с bootstrap первого human admin:

  • первый human admin внутри realm ksailab создаётся отдельным Keycloak operator flow;
  • рекомендуемый bootstrap username для этого flow — platform-admin;
  • backend onboarding endpoints не должны создавать первого human admin сами;
  • ksailab-admin-service не заменяет human admin и остаётся только service account path.

Какой identifier используется

В v1 основным login identifier считается username.

Username:

  • используется для первого локального входа через Keycloak;
  • остаётся человекочитаемым;
  • может предлагаться frontend автоматически;
  • валидируется backend как уникальный.

Это осознанный pragmatic choice для первого этапа. В будущем migration to LDAP/SSO должен добавить отдельный внешний identity binding, но не меняет текущий onboarding UX на старте.

Как выдаются стартовые credentials

Почта и внешние сервисы сейчас не используются.

Поэтому для v1 принимается такой порядок:

  • пароль генерируется системой;
  • create-операция возвращает credential_receipt;
  • оператор раскрывает временный пароль только через отдельный consume flow;
  • receipt одноразовый и ограничен по TTL;
  • пользователь обязан сменить пароль при первом входе.

Это ключевое отличие от старой модели: temporary_password не должен описываться как обычное inline-поле ответа на create request.

Canonical onboarding API

Текущая рабочая onboarding-поверхность backend:

  • POST /api/v1/onboarding/teachers
  • POST /api/v1/onboarding/groups
  • POST /api/v1/onboarding/groups/{group_id}/teachers
  • POST /api/v1/onboarding/groups/{group_id}/students/bulk
  • POST /api/v1/onboarding/credentials/consume

Именно эти endpoints нужно считать canonical current contract для первой волны интеграции.

Provisioning-модель по сущностям

1. Teacher account provisioning

Teacher provisioning — это отдельная административная операция, а не обычный CRUD профиля.

Поток:

  1. admin открывает Permissions -> Users;
  2. вводит ФИО преподавателя;
  3. frontend предлагает username по шаблону transliteration;
  4. admin может подтвердить или поправить username;
  5. backend проверяет уникальность;
  6. backend создаёт account в Keycloak с realm role teacher;
  7. backend включает required action на смену пароля при первом входе;
  8. backend создаёт или связывает platform profile;
  9. backend возвращает profile + credential_receipt;
  10. оператор при необходимости вызывает POST /api/v1/onboarding/credentials/consume и получает временный пароль один раз.

Что не делает этот flow:

  • не рассылает приглашения;
  • не назначает преподавателя в группы автоматически;
  • не выдаёт bundles вручную в рамках этой операции.

2. Group provisioning

Group provisioning остаётся отдельной domain-операцией.

Поток:

  1. admin открывает Education -> Groups;
  2. создаёт одну группу или несколько групп подряд;
  3. после создания при необходимости назначает teacher в group;
  4. после этого group готова к приёму students.

Для первой версии допустим bulk UI с fan-out по single-create endpoint. Обязательный отдельный batch group API не требуется.

3. Teacher assignment to group

Назначение teacher в group — отдельная операция membership management.

Поток:

  1. admin открывает group detail или group management panel;
  2. выбирает преподавателя из active teacher accounts;
  3. backend создаёт group-teacher relation;
  4. преподаватель начинает видеть свой рабочий контур по ABAC.

Этот шаг сознательно отделён от teacher account creation, чтобы не смешивать identity creation и domain assignment.

4. Student bulk provisioning

Bulk student provisioning — это отдельная массовая операция, привязанная к конкретной группе.

Поток:

  1. admin открывает onboarding action из Education -> Groups;
  2. выбирает целевую группу;
  3. вводит список студентов;
  4. frontend предлагает usernames;
  5. backend создаёт student accounts в Keycloak;
  6. backend назначает всем студентам realm role student;
  7. backend связывает созданные accounts с group membership;
  8. для каждой успешно созданной записи backend возвращает отдельный credential_receipt;
  9. UI показывает результаты batch-операции и построчные статусы успеха/ошибки.

Требования к batch-операции:

  • частичный успех допустим;
  • ошибки по отдельным строкам должны быть явными;
  • уже созданные аккаунты не должны теряться из-за одной невалидной записи;
  • общая партия не должна получать один общий пароль на всех;
  • результат должен быть пригоден для ручной передачи логинов и одноразового получения временного пароля по каждой записи.

Контур ответственности

Что делает Keycloak

  • создаёт identity;
  • хранит username;
  • хранит credentials;
  • выдаёт realm role;
  • хранит required actions вроде UPDATE_PASSWORD.

Что делает backend

  • оркестрирует provisioning-операцию;
  • проверяет права admin;
  • валидирует уникальность и бизнес-ограничения;
  • создаёт или связывает platform profile;
  • создаёт group memberships;
  • возвращает credential_receipt и consume-flow для UI;
  • позже сможет подменить локальный credential-flow на LDAP/SSO-aware flow без смены UI-логики.

Что делает frontend

  • собирает удобную форму для оператора;
  • показывает предложенный username;
  • отображает результаты batch-операции;
  • не хранит пароль дольше, чем нужно для одноразового показа;
  • не принимает окончательных auth-решений сам.

Runtime capabilities для onboarding-операций

Первая landed версия onboarding уже опирается на явные backend capability keys:

  • auth.bootstrap.read
  • onboarding.teacher.create
  • onboarding.group.create
  • onboarding.group.assign_teacher
  • onboarding.student.bulk_create
  • onboarding.credentials.consume

Именно этот набор сейчас составляет минимальный runtime contract для первой фронтовой интеграции.

В будущем он может быть расширен и сведен с более общим catalog-driven permission model, но текущую реализацию нужно документировать именно так.

Целевые административные экраны

Permissions -> Users

Этот экран в первой версии должен отвечать за:

  • создание teacher accounts;
  • просмотр teacher/admin accounts;
  • деактивацию аккаунта;
  • запуск one-time credential handoff;
  • просмотр статуса "должен сменить пароль".

Education -> Groups

Этот экран должен отвечать за:

  • создание groups;
  • bulk creation groups через UI fan-out при необходимости;
  • назначение teacher к group;
  • переход к roster/onboarding студентов.

Education -> Groups -> Group Detail

Этот экран должен стать точкой для:

  • bulk create students;
  • просмотра текущего состава группы;
  • повторного provisioning отдельных students при ошибках;
  • управления membership.

Bridge с текущим backend

В старом backend уже были полезные legacy-контракты вроде /users/create, /users/bulk/create-students и /groups/management/*.

Но для актуальной документации KSAILab их нельзя описывать как основной текущий onboarding contract.

Правильная формулировка такая:

  • legacy endpoints могут оставаться переходным transport слоем внутри миграции;
  • canonical current onboarding API — это POST /api/v1/onboarding/*;
  • локальная password semantics больше не должна определять продуктовую документацию.

Expected results операций

Create teacher account

Минимальный результат create-операции:

  • profile
  • credential_receipt

Bulk create students

Минимальный результат batch-операции:

  • group_id
  • total_created
  • successes
  • errors

У каждой успешной student-записи:

  • user_id
  • username
  • credential_receipt

Consume credential receipt

Отдельный consume endpoint возвращает:

  • receipt_token
  • username
  • temporary_password
  • must_change_password
  • expires_at

Именно здесь временный пароль появляется впервые и только один раз.

Ограничения первой версии

  • Нет email invite flow.
  • Нет self-registration.
  • Нет teacher-side account provisioning.
  • Нет обязательного внешнего employee_id или student_id.
  • Нет внешнего OAuth/LDAP/SSO на входе.

Эти ограничения допустимы, пока документация явно не делает из них вечную архитектуру.

Validation и expected tests

Текущий backend уже должен подтверждать эту модель тестами на:

  • teacher onboarding;
  • group creation;
  • teacher assignment;
  • bulk student provisioning;
  • receipt consume;
  • single-use credential handoff;
  • partial success и per-row errors.

Frontend tests на UI-flow и безопасный one-time display остаются частью фронтового трека.

Критерии готовности модели

Модель считается достаточно проработанной, если по документам команда может без дополнительных продуктовых решений ответить:

  • кто имеет право заводить teacher и student accounts;
  • как создаётся group и как teacher назначается в неё;
  • как выдаётся credential_receipt и как он consume-ится;
  • что происходит при первом входе;
  • как старый frontend flow трансформируется в новый Keycloak-first provisioning;
  • где именно на текущем фронте будут жить onboarding-инструменты.

Связанные документы