# Authentication — handoff

## Summary

Auth covers login, registration, password reset, SSO, and server selection before the Matrix client starts. Sessions are persisted locally and restored on app launch via `ClientRoot`.

## User-facing behavior

- Pick homeserver (ServerPicker) or use default from config
- Login: password, token, SSO redirect
- Register: password-based with optional email flows
- Reset password flow
- Auth layout shows Paarrot branding
- Device display name defaults to `Paarrot`

## Architecture

```
Unauthenticated routes (AuthLayout)
  → Login / Register / ResetPassword / SSOLogin
  → session written to localStorage (sessions.ts)
ClientRoot (authenticated)
  → initClient(session) → startClient(mx)
```

## Key files

| Path | Role |
|------|------|
| `cinny/src/app/pages/auth/login/Login.tsx` | Login hub |
| `cinny/src/app/pages/auth/login/PasswordLoginForm.tsx` | Password login |
| `cinny/src/app/pages/auth/login/TokenLogin.tsx` | Access token login |
| `cinny/src/app/pages/auth/SSOLogin.tsx` | SSO redirect |
| `cinny/src/app/pages/auth/register/Register.tsx` | Registration |
| `cinny/src/app/pages/auth/register/PasswordRegisterForm.tsx` | Password register |
| `cinny/src/app/pages/auth/reset-password/ResetPassword.tsx` | Password reset |
| `cinny/src/app/pages/auth/ServerPicker.tsx` | Homeserver selection |
| `cinny/src/app/pages/auth/AuthLayout.tsx` | Auth chrome + logo |
| `cinny/src/app/pages/auth/login/loginUtil.ts` | Login helpers |
| `cinny/src/app/pages/auth/register/registerUtil.ts` | Register helpers |
| `cinny/src/app/state/sessions.ts` | Session storage |
| `cinny/src/client/initMatrix.ts` | Client init from session |
| `cinny/src/app/pages/afterLoginRedirectPath.ts` | Post-login redirect |

## Data model

| Key | Storage | Content |
|-----|---------|---------|
| Session store | localStorage | access token, user id, device id, hs url |
| `setAfterLoginRedirectPath` | sessionStorage/memory | deep link target after login |

## Dependencies

- `matrix-js-sdk` login/register APIs
- Homeserver `.well-known` / login flows (`useParsedLoginFlows`, `useAuthFlows`)
- OIDC/SSO via redirect URLs

## Integration points

- **Router**: unauthenticated vs `ClientRoot` split
- **matrix-client**: `initClient` consumes session
- **Device verification**: post-login verification UI in router

## Testing

### Manual

1. Login with password on test homeserver.
2. Token login with valid access token.
3. SSO flow if server supports it.
4. Register new account; verify email if required.
5. Logout clears session and returns to login.

### Automated

- None

## Known issues & gotchas

- `initial_device_display_name: 'Paarrot'` hardcoded in login/register forms
- Session logout from server triggers full localStorage clear + reload
- Server picker URL must match actual homeserver capabilities

## Future work

- Multi-account without full reload (see account-switcher)
- Passkey / WebAuthn if upstream adds support

## Related docs

- [matrix-client HANDOFF](../matrix-client/HANDOFF.md)
- [e2e-and-devices HANDOFF](../e2e-and-devices/HANDOFF.md)

## Add your extra things here

- Auth routes: `LOGIN_PATH`, `REGISTER_PATH`, `RESET_PASSWORD_PATH` in `paths.ts`
- `UnAuthRouteThemeManager` vs `AuthRouteThemeManager` in ThemeManager.tsx
