Commit Graph
18 Commits
Author SHA1 Message Date
jason.woltje 128431ba58 fix(api,web): separate workspace context from auth session (#551)
Co-authored-by: Jason Woltje <[email protected]>
Co-committed-by: Jason Woltje <[email protected]>
2026-02-28 15:14:29 +00:00
jason.woltje 5f6c520a98 fix(auth): prevent login page freeze on OAuth sign-in failure (#506)
Co-authored-by: Jason Woltje <[email protected]>
Co-committed-by: Jason Woltje <[email protected]>
2026-02-25 01:59:36 +00:00
jason.woltje dedc1af080 fix(auth): restore BetterAuth OIDC flow across api/web/compose 2026-02-17 23:37:49 -06:00
Jason WoltjeandClaude Opus 4.6 9d3a673e6c fix(#411): resolve CI lint errors — prettier, unused directives, no-base-to-string
- auth.config.ts: collapse multiline template literal to single line
- auth.controller.ts: add eslint-disable for intentional no-unnecessary-condition
- auth.service.ts: remove 5 unused eslint-disable directives (Node 24 resolves
  BetterAuth types), fix prettier formatting, fix no-base-to-string
- login/page.tsx: remove unnecessary String() wrapper
- auth-context.test.tsx: fix prettier line length

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 17:00:01 -06:00
Jason WoltjeandClaude Opus 4.6 4d9b75994f fix(#411): add runtime null checks in auth controller — defense-in-depth for AuthenticatedRequest
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 15:44:31 -06:00
Jason WoltjeandClaude Opus 4.6 0a2eaaa5e4 refactor(#411): QA-011 — unify request-with-user types into AuthenticatedRequest
Replace 4 redundant request interfaces (RequestWithSession, AuthRequest,
BetterAuthRequest, RequestWithUser) with AuthenticatedRequest and
MaybeAuthenticatedRequest in apps/api/src/auth/types/.

- AuthenticatedRequest: extends Express Request with non-optional user/session
  (used in controllers behind AuthGuard)
- MaybeAuthenticatedRequest: extends Express Request with optional user/session
  (used in AuthGuard and CurrentUser decorator before auth is confirmed)
- Removed dead-code null checks in getSession (AuthGuard guarantees presence)
- Fixed cookies type safety in AuthGuard (cast from any to Record)
- Updated test expectations to match new type contract

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 14:00:14 -06:00
Jason WoltjeandClaude Opus 4.6 27c4c8edf3 fix(#411): QA-010 — fix minor JSDoc and comment issues across auth files
Fix response.ok JSDoc (2xx not 200), remove stale token refresh claim,
remove non-actionable comment, fix CSRF comment placement, add 403 mapping rationale.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 13:50:04 -06:00
Jason WoltjeandClaude Opus 4.6 8a572e8525 fix(#411): QA-004 — HttpException for session guard + PDA-friendly auth error
getSession now throws HttpException(401) instead of raw Error.
handleAuth error message updated to PDA-friendly language.
headersSent branch upgraded from warn to error with request details.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 13:18:53 -06:00
Jason WoltjeandClaude Opus 4.6 3b2356f5a0 feat(#413): add OIDC provider health check with 30s cache
- isOidcProviderReachable() fetches discovery URL with 2s timeout
- getAuthConfig() omits authentik when provider unreachable
- 30-second cache prevents repeated network calls

Refs #413

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 11:20:05 -06:00
Jason WoltjeandClaude Opus 4.6 2d59c4b2e4 feat(#413): implement GET /auth/config discovery endpoint
- Add getAuthConfig() to AuthService (email always, OIDC when enabled)
- Add GET /auth/config public endpoint with Cache-Control: 5min
- Place endpoint before catch-all to avoid interception

Refs #413

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 11:14:51 -06:00
Jason WoltjeandClaude Opus 4.6 9ae21c4c15 fix(#412): wrap BetterAuth handler in try/catch with error logging
Refs #412

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 11:08:47 -06:00
Jason WoltjeandClaude Opus 4.6 976d14d94b fix(#412): enable PKCE, fix docker OIDC default, document @SkipCsrf
- AUTH-003: Add safe empty default for OIDC_REDIRECT_URI in swarm compose
- AUTH-004: Enable PKCE (pkce: true) in genericOAuth config (in prior commit)
- AUTH-005: Document @SkipCsrf() rationale (BetterAuth internal CSRF)

Refs #412

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 11:04:34 -06:00
jason.woltjeandClaude Opus 4.6 3376d8162e fix(#410): skip CSRF guard on auth catch-all route
The global CsrfGuard blocks POST /auth/sign-in/oauth2 with 403 because
unauthenticated users have no session and therefore no CSRF token.
BetterAuth handles its own CSRF protection via toNodeHandler().

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 03:41:50 -06:00
jason.woltjeandClaude Opus 4.6 ba54de88fd fix(#410): use toNodeHandler for BetterAuth Express compatibility
BetterAuth expects Web API Request objects (Fetch API standard) with
headers.get(), but NestJS/Express passes IncomingMessage objects with
headers[] property access. Use better-auth/node's toNodeHandler to
properly convert between Express req/res and BetterAuth's Web API handler.

Also fixes vitest SWC config to read the correct tsconfig for NestJS
decorator metadata emission, which was causing DI injection failures
in tests.

Fixes #410

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 19:06:49 -06:00
Jason Woltje 970cc9f606 fix(#338): Add rate limiting and logging to auth catch-all route
- Apply restrictive rate limits (10 req/min) to prevent brute-force attacks
- Log requests with path and client IP for monitoring and debugging
- Extract client IP handling for proxy setups (X-Forwarded-For)
- Add comprehensive tests for rate limiting and logging behavior

Refs #338
Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-05 16:49:06 -06:00
jason.woltjeandClaude Sonnet 4.5 a2b61d2bff feat(#193): Align authentication mechanism between API and web client
- Update AuthUser type in @mosaic/shared to include workspace fields
- Update AuthGuard to support both cookie-based and Bearer token authentication
- Add /auth/session endpoint for session validation
- Install and configure cookie-parser middleware
- Update CurrentUser decorator to use shared AuthUser type
- Update tests for cookie and token authentication (20 tests passing)

This ensures consistent authentication handling across API and web client,
with proper type safety and support for both web browsers (cookies) and
API clients (Bearer tokens).

Fixes #193

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
2026-02-03 22:29:42 -06:00
Jason Woltje 48abdbba8b fix(api): add WorkspaceGuard to controllers and fix route ordering 2026-01-29 20:15:33 -06:00
Jason WoltjeandClaude Sonnet 4.5 6a038d093b feat(#4): Implement Authentik OIDC authentication with BetterAuth
- Integrated BetterAuth library for modern authentication
- Added Session, Account, and Verification database tables
- Created complete auth module with service, controller, guards, and decorators
- Implemented shared authentication types in @mosaic/shared package
- Added comprehensive test coverage (26 tests passing)
- Documented type sharing strategy for monorepo
- Updated environment configuration with OIDC and JWT settings

Key architectural decisions:
- BetterAuth over Passport.js for better TypeScript support
- Separation of User (DB entity) vs AuthUser (client-safe subset)
- Shared types package to prevent FE/BE drift
- Factory pattern for auth config to use shared Prisma instance

Ready for frontend integration (Issue #6).

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>

Fixes #4
2026-01-28 17:26:34 -06:00