The first authenticated-user concept in Aurora Core -- everything else in
this codebase is public, read-only catalog data. Foundation for ratings
and a watchlist (not yet built): POST /auth/register, POST /auth/login,
GET /auth/me.
Security specifics worth knowing:
- Passwords hashed with argon2 (via argon2-cffi), never stored plain or
logged.
- Login returns an identical 401 for a nonexistent email and a wrong
password on a real one, including matching response timing
(burn_time_like_a_password_check) -- otherwise either the status code
or the timing alone lets a client enumerate registered emails.
- AURORA_SECRET_KEY now actually signs JWTs (previously defined but
unused anywhere) -- .env.example's existing token_urlsafe(48) guidance
already produces a long enough key, just flagged its new stakes.
- Email matched case-insensitively via explicit normalization in the
service layer, not relied on from Pydantic's EmailStr (which does not
lowercase the local part).
12 new integration tests (register/login/me over real HTTP via the
`client` fixture) plus 10 unit tests for the hashing/JWT logic itself,
following the same-day lesson that only unit tests actually execute
locally without Postgres -- the auth core is tested for real here rather
than only through integration tests that might not run before a deploy.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
app/services/common.py:build_watch_providers_out calls
aurora_id("watch_provider", ...) for every provider entry -- this raised
ValueError on any movie/series detail response (or the dedicated
/watch-providers route) containing watch-provider data, since the entity
type was never added to ENTITY_PREFIXES. Never caught locally because
every test exercising this path is an integration test that skips
without a reachable Postgres.
Not yet deployed (redeploy has been on hold pending the bulk import), so
this never hit production traffic, but confirms it's worth actually
running the test suite against real Postgres before the next deploy
rather than trusting lint/mypy + locally-skipped tests alone.
Co-Authored-By: Claude Sonnet 5 <[email protected]>