Client portal auth (Phase 1): per-project link + password gate #63
Reference in New Issue
Block a user
Delete Branch "feat/portal-auth"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Gates each project's read-only client portal behind a secure per-project link + shared password (argon2). Operators manage access from a new "Portal access" panel on the project page (enable, generate password, copy link). Replaces the interim per-client magic-link.
projectscolumns (portal_enabled,portal_password_hash,portal_link_token) + idempotent migration./portal/enter,/portal/open,PORTAL_OPEN_LINKS,portal_admin.py mint-link).SECRET_KEY/COOKIE_SECUREnow pass throughdocker-compose.yml(set via.env).Deferred by design (see
docs/superpowers/specs/2026-06-15-portal-auth-design.md): operator auth for the internal app, full multi-tenancy.Test Plan
pytest tests/— 28 passing (gate, lockout, scope isolation incl. WS, operator endpoints, migration, cookie flag, retired routes)migrate_add_project_portal_auth.py)Upgrade / rollout
argon2-cffi→ rebuild the image (won't boot without it).python3 backend/migrate_add_project_portal_auth.pyper DB.SECRET_KEY(+COOKIE_SECURE=trueonce on HTTPS) before the portal is internet-facing.🤖 Generated with Claude Code