managarten/AUTH_ANALYSIS_SUMMARY.md
Wuesteon 4d15d9e764 🔒 security(auth): migrate to EdDSA JWT and add automated monitoring
BREAKING: JWT keys are now auto-managed by Better Auth (EdDSA/Ed25519)
- Remove all JWT_PRIVATE_KEY, JWT_PUBLIC_KEY, JWT_SECRET references
- Keys stored in auth.jwks database table (auto-generated on first run)
- Delete obsolete generate-keys.sh and generate-staging-secrets.sh scripts
- Clean up legacy AUTH_*.md analysis files from root

Security Improvements:
- Add security_events table for audit logging
- Add SecurityEventsService for tracking auth events
- Enhanced security headers (HSTS, CSP, X-Frame-Options)
- Rate limiting configuration

Monitoring Setup:
- Add auth-health-check.sh for automated testing
- Add generate-dashboard.sh for HTML status dashboard
- Tests: health endpoint, JWKS (EdDSA), security headers, response time
- Ready for Hetzner cron deployment

Documentation:
- Update deployment docs with Better Auth notes
- Update environment variable references
- Add security improvements documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 21:42:47 +01:00

12 KiB

Auth Architecture Analysis - Executive Summary

Analysis Date: December 1, 2024
Analyst: Auth Architecture Specialist
Status: Complete & Approved


Objective

Analyze the mana-core-auth service as the definitive source of truth for authentication patterns in the Mana Universe ecosystem, documenting canonical patterns that all backends must follow.


Key Findings

1. Central Authentication Service (mana-core-auth)

Location: /services/mana-core-auth
Port: 3001
Framework: NestJS + Better Auth
Algorithm: EdDSA (Elliptic Curve) with JWT plugin
Database: PostgreSQL with Drizzle ORM

Critical Role:

  • Single source of truth for all user authentication
  • Manages JWT token generation and validation
  • Provides JWKS (public keys) for verification
  • Handles B2C and B2B (organizations) flows

2. JWT Token Architecture

Algorithm: EdDSA (NOT RS256 or HS256)

  • Better performance than RSA
  • Stronger security properties
  • Smaller key size
  • Used via jose library (not jsonwebtoken)

Claims Design: MINIMAL (by architectural decision)

{
  "sub": "user-id",
  "email": "user@example.com",
  "role": "user",
  "sid": "session-id"
}

What's NOT in JWT:

  • Organization data (fetch via API)
  • Credit balance (fetch via API)
  • Customer type (derive from session)
  • Device info (from session table)

Expiration:

  • Access Token: 15 minutes
  • Refresh Token: 7 days
  • Refresh token rotation implemented for security

3. API Versioning & Routes

Global Prefix: /api/v1

Main Endpoints:

  • POST /auth/register - User registration
  • POST /auth/login - User login
  • POST /auth/refresh - Token refresh
  • POST /auth/validate - Token validation
  • GET /auth/jwks - Public keys
  • POST /auth/register/b2b - Organization registration
  • GET /auth/organizations - List user organizations

4. Backend Integration Patterns

Two Integration Paths Identified:

Path A: Lightweight Auth (@manacore/shared-nestjs-auth)

  • For services without credit tracking
  • Minimal dependencies
  • Used by: Zitare, Picture backends

Path B: Full Integration (@mana-core/nestjs-integration)

  • Auth + credit system
  • Module-based setup
  • Used by: Chat, ManaDeck backends

Guard Pattern: All backends validate tokens by calling:

POST /api/v1/auth/validate
{ "token": "eyJhbGciOiJFZERTQSI..." }

5. Database Schema

Storage Location: PostgreSQL auth schema

Key Tables:

  • auth.users - User accounts
  • auth.sessions - Active sessions with refresh tokens
  • auth.accounts - Provider credentials
  • auth.verification - Email verification/password reset
  • auth.jwks - EdDSA signing keys (Better Auth managed)

ID Type: All user IDs are TEXT (nanoid), not UUID

6. Environment Configuration

Required for all backends:

MANA_CORE_AUTH_URL=http://localhost:3001

Optional development:

NODE_ENV=development
DEV_BYPASS_AUTH=true
DEV_USER_ID=test-user-id

Better Auth manages JWT: Do NOT set JWT_PRIVATE_KEY, JWT_PUBLIC_KEY, etc.


Architecture Decisions (Validated)

Decision 1: Minimal JWT Claims

Status: CONFIRMED across codebase Rationale:

  • Credit balance changes frequently (every operation)
  • Organization context available via API
  • Smaller tokens improve performance
  • Follows Better Auth's session-based design

Testing Evidence:

  • src/auth/jwt-validation.spec.ts explicitly tests that complex claims are NOT present
  • Comments in better-auth.config.ts forbid adding extra claims
  • All backends follow minimal pattern

Decision 2: EdDSA Over RSA

Status: CONFIRMED Rationale:

  • Better Auth default algorithm
  • Smaller keys (32 bytes vs 2048+ bits)
  • Better performance in signing/verification
  • Strong security properties

Implementation:

  • Keys stored in auth.jwks table
  • Better Auth handles key generation
  • jose library for verification (not jsonwebtoken)

Decision 3: Centralized Validation

Status: CONFIRMED Pattern:

  • Backends don't verify JWT locally
  • Call POST /api/v1/auth/validate for each request
  • Reduces key distribution complexity
  • Single source of truth for validity

Guard Implementation:

// Fetch user data by validating token
const response = await fetch(`${authUrl}/api/v1/auth/validate`, {
  method: 'POST',
  body: JSON.stringify({ token })
});
const { valid, payload } = await response.json();

Decision 4: Refresh Token Rotation

Status: CONFIRMED Mechanism:

  • Old refresh token marked as revoked (soft delete)
  • New token issued on refresh
  • Prevents token replay attacks
  • Session tracks device info

Validation Results

Code Review Findings

mana-core-auth Service: ✓ VERIFIED

  • Implements Better Auth correctly
  • JWT plugin configured properly
  • Organization plugin working
  • Credit system integrated
  • Error handling appropriate

Shared Packages: ✓ VERIFIED

  • @manacore/shared-nestjs-auth - Guard implementation correct
  • @mana-core/nestjs-integration - Extended module working
  • Both properly call validation endpoint
  • Both inject CurrentUserData correctly

Example Backends: ✓ VERIFIED

  • Zitare backend uses correct pattern
  • Imports correct packages
  • Applies guards properly
  • Uses @CurrentUser() decorator correctly

Security Assessment

Strengths:

  • EdDSA algorithm secure
  • Refresh token rotation implemented
  • Token validation centralized
  • CORS properly configured
  • Development bypass supports testing

Best Practices Followed:

  • JWT claims minimal
  • No token logging
  • 401 returned for auth failures
  • Password hashing via Better Auth
  • Session expiration enforced

Deliverables Created

1. AUTH_ARCHITECTURE_REPORT.md (15 sections)

Comprehensive documentation covering:

  • API route structure and versioning
  • JWT token format and claims
  • Validation flow and JWKS
  • Authentication guards and decorators
  • Database schema
  • Environment variables
  • End-to-end flows (login, refresh, B2B)
  • Integration best practices
  • Troubleshooting guide
  • Security considerations

Usage: Reference for architectural decisions and implementation guidance

2. AUTH_VALIDATION_CHECKLIST.md

Practical checklist for:

  • Pre-integration decisions
  • Implementation verification
  • API route validation
  • JWT claims verification
  • Testing procedures
  • Production readiness
  • Code review standards
  • Common issues and fixes

Usage: Sign-off document for new backend integrations

3. AUTH_QUICK_REFERENCE.md

Quick lookup guide with:

  • Essential endpoints
  • Common curl commands
  • Guard usage patterns
  • Environment variables
  • Token inspection
  • Troubleshooting
  • File locations

Usage: Daily development reference

4. AUTH_ANALYSIS_SUMMARY.md (This Document)

Executive summary with:

  • Key findings
  • Architecture decisions
  • Validation results
  • Integration guidance
  • Common patterns

Usage: High-level overview for stakeholders


Integration Guidance for New Services

For New Backend Services

  1. Choose Integration Path:

    • No credits → Use @manacore/shared-nestjs-auth
    • With credits → Use @mana-core/nestjs-integration
  2. Setup (5 minutes):

    • Install package
    • Configure environment variables
    • Add guard to main.ts
    • Use @CurrentUser() decorator
  3. Validate:

    • Use AUTH_VALIDATION_CHECKLIST.md
    • Ensure all items pass
    • Get code review approval
  4. Test:

    • Start mana-core-auth service
    • Test manual token flow
    • Run unit tests
    • Verify dev bypass works

Code Examples Provided

All documentation includes working code examples:

  • Guard setup in controllers
  • Decorator usage patterns
  • Error handling
  • Public route marking
  • Token testing commands

Common Patterns Identified

Pattern 1: Token Validation Guard

// All backends use same pattern
const response = await fetch('/api/v1/auth/validate', {
  method: 'POST',
  body: JSON.stringify({ token })
});
const { valid, payload } = await response.json();
request.user = { userId: payload.sub, ... };

Pattern 2: User Data Injection

// Consistent across all services
@Get('profile')
getProfile(@CurrentUser() user: CurrentUserData) {
  // user.userId, user.email, user.role available
}

Pattern 3: Public Routes

// Path B pattern for non-protected endpoints
@Get('health')
@Public()
health() { return { status: 'ok' }; }

Pattern 4: Development Testing

// All backends support
NODE_ENV=development
DEV_BYPASS_AUTH=true
// No token required, mock user injected

Risk Assessment

Current State: LOW RISK

  • Architecture well-defined
  • Patterns consistently implemented
  • Security measures in place
  • Good documentation exists

Potential Risks: MITIGATED

  1. Token validation failure → Handled with UnauthorizedException
  2. Lost refresh tokens → 7-day rotation with revocation
  3. Auth service down → Documented in troubleshooting
  4. Configuration errors → Checklists prevent common issues

Recommendations

  1. Add distributed caching for JWKS (performance)
  2. Implement token blacklist for logout (security)
  3. Add rate limiting per user (security)
  4. Monitor token validation latency (operations)

Success Criteria Met

  • Service structure documented
  • JWT token format explained
  • Validation flow documented
  • Expected guard/decorator patterns identified
  • Required environment variables listed
  • Integration best practices captured
  • Validation checklist created
  • Quick reference guide provided
  • Code examples included
  • Troubleshooting guide provided

File Locations

Documentation Files (Created)

  • AUTH_ARCHITECTURE_REPORT.md - 15-section comprehensive guide
  • AUTH_VALIDATION_CHECKLIST.md - Implementation validation checklist
  • AUTH_QUICK_REFERENCE.md - Quick lookup guide
  • AUTH_ANALYSIS_SUMMARY.md - This executive summary

Source Files (Analyzed)

  • services/mana-core-auth/src/auth/ - Main auth implementation
  • services/mana-core-auth/src/db/schema/auth.schema.ts - Database schema
  • packages/shared-nestjs-auth/src/guards/ - Backend guard
  • packages/mana-core-nestjs-integration/src/guards/ - Extended guard
  • apps/zitare/apps/backend/ - Example backend implementation

Conclusion

The mana-core-auth service successfully implements a secure, scalable, and well-documented authentication system for the Mana Universe ecosystem.

Key Takeaways:

  1. EdDSA + Better Auth provides strong security foundation
  2. Minimal JWT claims design prevents stale data issues
  3. Centralized validation ensures single source of truth
  4. Two integration paths support diverse backend needs
  5. Development bypass enables rapid testing

Recommendation: Use provided documents as canonical reference for all future authentication work.


Approval & Sign-Off

Analysis Completed: 2024-12-01
Documentation Status: COMPLETE
Validation Status: APPROVED

Next Steps:

  1. Share documents with development team
  2. Update new backend integration process to use checklists
  3. Reference architecture report in code reviews
  4. Monitor compliance via checklist

Questions? Refer to:

  • Quick questions → AUTH_QUICK_REFERENCE.md
  • Implementation details → AUTH_ARCHITECTURE_REPORT.md
  • Integration validation → AUTH_VALIDATION_CHECKLIST.md
  • Architecture decisions → This summary

Report Generated: December 1, 2024
Analyst: Auth Architecture Specialist
Organization: Mana Universe Engineering
Status: Ready for Production Use