Кабинет клиента
Кабинет живёт в том же SPA под /portal/*; вход — magic link, пароль или OAuth (Аутентификация), токен со scope client не подходит к админским роутам. API — /portal/v1.
Экраны
Section titled “Экраны”Вход — форма строится по GET /portal/v1/auth/methods: пароль и OAuth-кнопки (если включены) + «войти по ссылке» (magic link, всегда; он же — «забыли пароль»). Ответ на запрос ссылки одинаков для любого email.
Регистрация — виден при registration != closed: email + пароль или OAuth-кнопки → подтверждение email (для пароля) → в режиме application — экран «заявка на рассмотрении», в open — сразу кабинет. Пароль можно задать/сменить и позже, в настройках аккаунта.
Подписки — GET /portal/v1/me: список подписок клиента, для каждой:
- статус и срок (
expires_at, обратный отсчёт); - расход трафика: прогресс
traffic_used_bytes / traffic_limit_bytes, график по дням (GET …/usage?granularity=day); - ссылка подписки + QR (
GET …/link) с кнопками импорта в популярные клиенты; - перевыпуск ключей (
POST …/rotate-credentials) с подтверждением: старые конфиги перестанут работать сразу.
Оплата — при включённом биллинге: тарифы (GET /portal/v1/plans), выбор способа оплаты, если провайдеров несколько (GET /portal/v1/payment-methods), POST /portal/v1/checkout → редирект на агрегатора. Статус платежа кабинет узнаёт поллингом своей подписки — активация происходит по вебхуку на backend (Платежи).
Подписка suspended по лимиту показывает дату сброса периода или предложение продлить; expired — только продление.