Passwordless sign-in: email magic link as primary auth (password optional) #42
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Change the way people sign up / sign in. The email magic link becomes the primary method; passwords become optional/secondary.
Flow
Notes
Filed from the conference-organiser action items (2026-06-24). P0.
Implemented + live-tested. Commits on
development:b90afee(feature),0dc7671(in-process test + lib/bin split).What changed — primary sign-in is now an admin-distributed email magic link; password is an optional fallback.
"login"token kind: 5-day TTL, MULTI-USE (the same emailed link signs in on multiple devices/sessions throughout the event); invite/reset stay single-use.auth_send_login_link(admin-gated, no account enumeration, 30s per-email throttle) emails{app_url}?login=<token>.auth_consume_magic_linkmints a new session per consume, never deletes the token until expiry.auth_set_my_passwordlets a logged-in user set/change a password.subtle::ct_eq) compares for token + password-hash.?login=auto-login page (reuses the verified invite-success pattern), admin "Send sign-in link" control + login email template, profile change-password section.Live test (stack up under the new
cm50_app/socket, browser-driven):cm50_app; UI served + loads?login=<invalid>error path (live RPC)Multi-use/kind-gated/expiry consume behavior is pinned by
cm50_app_server/tests/magic_link.rs.One remaining caveat (environment, not code): real email delivery can only be confirmed against a live Resend config (API key + verified
meet.tffrom-domain in Admin → Email).auth_send_login_linkmints the token and returns success before the send; the success banner proves the RPC works, not that an email arrived. Set up Resend and send yourself a link to confirm end-to-end delivery.Also flagged:
CARGO_TARGET_DIRisn't exported by the currentinit.shshell, somake installcan deploy a stale binary from the repo-localtarget/instead of the shared build dir — export it (orlab build --install) when deploying.