[105-15] CoopID-восстановление: confirm→username, AAD account-независим, десктоп magic-link (Эпик 12) #144

Closed
claude wants to merge 2 commits from feat/coopid-12-recovery-account-from-confirm into feat/coopid-epic-9-metrics
Owner

Что

Доводит контур восстановления доступа CoopID (Эпик 12, Story 12.1–12.3) до минимально работоспособного состояния и убирает лишний механизм.

Бэкенд (controller)

  • POST /coop/recovery/confirm теперь возвращает { username } (резолвится из recovery-токена) — клиент по нему скачивает/расшифровывает новый vault при повторном входе. Отдельный whoami-by-token не нужен.
  • magic-link приведён к канону приложения: ${frontend_url}/${coopname}/auth/recover/${token} (как invite), вместо coopname-less /recover/${token}.

SDK (@coopenomics/auth)

  • AAD vault'а сделан account-независимым (тип субъекта, без id): пер-юзер привязку даёт пароль + соль-на-блоб; account-id в AAD не был контролем доступа (блоб и так публично читается по account). Решение владельца 2026-06-15.
  • loginWithMagicLink больше не принимает account — берёт username из ответа confirm.

Десктоп (Story 12.3)

  • Новый feature RecoverAccess + widget/page: экран запроса magic-link и landing-подтверждение (email + TOTP + новый пароль) поверх loginWithMagicLink. Канон: AuthCard/OtpInput/Base*.
  • Роут :coopname/auth/recover[/:token]; «Потеряли ключ?» ведёт на CoopID-recover.

Известный шов (вне scope)

Полный вход в приложение сразу после recovery упирается в мост подписи CoopID: session.init строит wharfkit-Session из globalStore.wif, а новый WIF живёт только в keystore SDK. Это 11.5/Эпик-7. Сейчас после успеха — переход на вход с уведомлением.

Тесты

SDK vitest 29/29 (vault/wallet/magic-link/migration/store), controller jest recovery-confirm 9/9 + recovery.service 6/6, ESLint десктопа 0, auth tsc clean.

🤖 Generated with Claude Code

## Что Доводит контур восстановления доступа CoopID (Эпик 12, Story 12.1–12.3) до минимально работоспособного состояния и убирает лишний механизм. ### Бэкенд (controller) - `POST /coop/recovery/confirm` теперь возвращает `{ username }` (резолвится из recovery-токена) — клиент по нему скачивает/расшифровывает новый vault при повторном входе. **Отдельный whoami-by-token не нужен.** - magic-link приведён к канону приложения: `${frontend_url}/${coopname}/auth/recover/${token}` (как invite), вместо coopname-less `/recover/${token}`. ### SDK (@coopenomics/auth) - AAD vault'а сделан **account-независимым** (тип субъекта, без id): пер-юзер привязку даёт пароль + соль-на-блоб; account-id в AAD не был контролем доступа (блоб и так публично читается по account). Решение владельца 2026-06-15. - `loginWithMagicLink` больше **не принимает `account`** — берёт username из ответа confirm. ### Десктоп (Story 12.3) - Новый feature `RecoverAccess` + widget/page: экран запроса magic-link и landing-подтверждение (email + TOTP + новый пароль) поверх `loginWithMagicLink`. Канон: AuthCard/OtpInput/Base*. - Роут `:coopname/auth/recover[/:token]`; «Потеряли ключ?» ведёт на CoopID-recover. ### Известный шов (вне scope) Полный вход в приложение сразу после recovery упирается в мост подписи CoopID: `session.init` строит wharfkit-Session из `globalStore.wif`, а новый WIF живёт только в keystore SDK. Это 11.5/Эпик-7. Сейчас после успеха — переход на вход с уведомлением. ## Тесты SDK vitest 29/29 (vault/wallet/magic-link/migration/store), controller jest recovery-confirm 9/9 + recovery.service 6/6, ESLint десктопа 0, auth tsc clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 2 commits 2026-06-15 05:23:52 +00:00
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Coopname-scoped magic-link URL :coopname/auth/recover/:token (как invite), новый
feature RecoverAccess + widget/page (канон AuthCard/OtpInput/Base*), вход 'Потеряли
ключ?' ведёт на CoopID-recover. Полный вход в приложение после recovery упирается в
мост подписи CoopID (session.init строит wharfkit-Session из globalStore.wif) — 11.5/Эпик-7.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ant added this to the CoopID project 2026-06-15 13:17:41 +00:00
Author
Owner

Схлопнут в единый PR #148 (coopID → dev). Ветка сохранена как резерв, ничего не потеряно.

Схлопнут в единый PR #148 (coopID → dev). Ветка сохранена как резерв, ничего не потеряно.
claude closed this pull request 2026-06-15 13:26:49 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#144