🔍 Webapp Authentication Audit Summary
📋 Audit Overview
Section titled “📋 Audit Overview”This document summarizes the comprehensive audit of the apps/webapp/ directory to ensure consistent use of centralized authentication utilities and elimination of metadata-based admin requests. The audit also covers the successful consolidation of middleware using the enhanced shared middleware approach.
✅ What Was Audited
Section titled “✅ What Was Audited”Files Examined
Section titled “Files Examined”src/middleware.ts- Route-level authentication and admin checkssrc/lib/api/base-handler.ts- API route base class with auth utilitiessrc/layouts/AdminLayout.astro- Admin layout with role checkingsrc/components/navigation/Sidebar.astro- Navigation with admin visibility- All API routes using
BaseAPIHandler - All Astro pages using authentication utilities
Note: Astro authentication utilities have been moved to @repo/auth/astro package for reusability across applications.
Import Patterns Analyzed
Section titled “Import Patterns Analyzed”@repo/authimports (core authentication package)@/lib/api/base-handlerimports (API route base class)@/lib/astro-auth-utilsimports (page-level utilities)- Direct
locals.useraccess patterns - Direct
publicMetadata.roleschecks
🎯 Audit Results
Section titled “🎯 Audit Results”✅ Consistent Usage Patterns Found
Section titled “✅ Consistent Usage Patterns Found”1. Middleware Layer
Section titled “1. Middleware Layer”- Status: ✅ EXCELLENT
- Pattern: Uses enhanced shared middleware from
@repo/auth/middleware - Features: Organization context, complex route categorization, proper admin checking
- Security: Enforces authentication and admin checks at route level
- Architecture: Middleware chaining for auth + security features
2. API Route Layer
Section titled “2. API Route Layer”- Status: ✅ EXCELLENT
- Pattern: 100% of API routes use
BaseAPIHandler - Functions:
requireAuth(),requireAdmin(),handleRequest() - Security: Server-side authentication and authorization enforcement
3. Page-Level Authentication
Section titled “3. Page-Level Authentication”- Status: ✅ EXCELLENT
- Pattern: All pages use
@repo/auth/astro(centralized package) - Functions:
getUser(),getUserId(),requireAdmin() - Security: UI-level checks with server-side enforcement
✅ No Inconsistencies Found
Section titled “✅ No Inconsistencies Found”The audit revealed zero instances of:
- Direct
locals.useraccess bypassing centralized utilities - Direct
publicMetadata.roleschecks for admin validation - Custom authentication logic that duplicates centralized functions
- Inconsistent import patterns across the application
CSP Configuration Enhancement
Section titled “CSP Configuration Enhancement”Problem Identified
Section titled “Problem Identified”Browser console showed CSP violations blocking Clerk connections:
Content-Security-Policy violations: connect-src directive blocked loading of resource at `https://rapid-marten-5.clerk.accounts.dev/v1/client/sessions/sess...`Solution Implemented
Section titled “Solution Implemented”Enhanced shared middleware with comprehensive CSP configuration:
- Configurable CSP Options: Added
cspConfigtoMiddlewareConfiginterface - Clerk Domain Support: Comprehensive Clerk domain allowlist including wildcards
- Service Integration: Built-in support for Stripe, Sentry, Google services
- Flexible Configuration: Each app can customize CSP domains as needed
CSP Configuration Features
Section titled “CSP Configuration Features”cspConfig: { clerkDomains?: string[]; // Clerk authentication domains stripeDomains?: string[]; // Stripe payment domains sentryDomains?: string[]; // Sentry error tracking domains googleDomains?: string[]; // Google services domains additionalConnectSrc?: string[]; // Additional connect-src domains additionalScriptSrc?: string[]; // Additional script-src domains additionalFrameSrc?: string[]; // Additional frame-src domains}Default CSP Domains
Section titled “Default CSP Domains”- Clerk:
https://*.clerk.accounts.dev,https://*.clerk.com - Stripe:
https://api.stripe.com,https://*.js.stripe.com - Sentry:
https://*.sentry.io,https://js.sentry-cdn.com - Google:
https://maps.googleapis.com,https://fonts.googleapis.com
Implementation
Section titled “Implementation”- Shared Function:
generateCSPHeaders()in@repo/auth/middleware - Webapp: Configured with specific Clerk instances + wildcards
- CRM: Configured with standard Clerk domains + wildcards
- Future Apps: Can use defaults or customize as needed
🚀 Middleware Consolidation Achievements
Section titled “🚀 Middleware Consolidation Achievements”Enhanced Shared Middleware
Section titled “Enhanced Shared Middleware”Successfully implemented a single, enhanced middleware that supports:
- Basic Apps: Simple protected/public/admin route handling
- Advanced Apps: Organization context, complex route categorization
- Flexible Configuration: Enable/disable features as needed
Middleware Chaining Implementation
Section titled “Middleware Chaining Implementation”Both webapp and CRM now use Astro’s built-in sequence() function to combine:
- Auth Middleware: Route protection and user context
- Security Middleware: CSP headers, security headers, rate limiting
Benefits of using sequence():
- Type Safety: Built-in TypeScript support
- Performance: Optimized execution order
- Idiomatic: Follows Astro best practices
- Maintainable: Clear separation of concerns
- Testable: Each middleware can be tested independently
Configuration Examples
Section titled “Configuration Examples”Webapp (Advanced Features)
Section titled “Webapp (Advanced Features)”const config = { protectedRoutes: ['/dashboard', '/orders', '/erp', '/admin', '/billing', '/organization'], publicRoutes: ['/', '/sign-in', '/sign-up', '/waitlist', '/contact', '/demo'], adminRoutes: ['/admin'], organizationRequiredRoutes: ['/billing', '/organization'], organizationOptionalRoutes: ['/dashboard', '/orders', '/erp'], enableOrganizationContext: true, // Enable advanced org-aware features};CRM (Basic Features)
Section titled “CRM (Basic Features)”const config = { protectedRoutes: ['/dashboard', '/companies', '/contacts', '/tasks'], publicRoutes: ['/', '/sign-in', '/sign-up'], adminRoutes: [], // No admin routes yet enableOrganizationContext: false, // Simple auth only};🔧 Improvements Made
Section titled “🔧 Improvements Made”1. Middleware Consolidation
Section titled “1. Middleware Consolidation”- Before: Each app had custom middleware with duplicated logic
- After: Single enhanced middleware used by all apps with configuration
- Benefits: Consistency, maintainability, reusability, centralized testing
2. Enhanced Features
Section titled “2. Enhanced Features”- Organization Context: Support for multi-tenant applications
- Advanced Route Types: Support for org-required/optional routes
- Proper Admin Checking: Uses
isOrganizationAdmin()instead of metadata - Early User Fetching: Performance optimization for org context
3. Middleware Chaining
Section titled “3. Middleware Chaining”- Before: Single middleware handling all concerns
- After: Chained middleware for separation of concerns
- Benefits: Modularity, easier testing, flexible security features
4. Package Centralization
Section titled “4. Package Centralization”- Before: Astro utilities scattered across apps
- After: Centralized in
@repo/auth/astropackage - Benefits: Reusability, consistent maintenance, better testing
📚 Documentation Created
Section titled “📚 Documentation Created”1. Authentication Architecture Guide
Section titled “1. Authentication Architecture Guide”- File:
docs/authentication-architecture.md - Purpose: Comprehensive guide for developers on authentication architecture
- Content: Architecture layers, available utilities, security considerations, migration guide
2. Updated Audit Summary
Section titled “2. Updated Audit Summary”- File:
docs/webapp-auth-audit-summary.md(this document) - Purpose: Record of audit findings and middleware consolidation
- Content: Audit results, improvements made, new architecture
🔒 Security Architecture Confirmation
Section titled “🔒 Security Architecture Confirmation”Authentication Flow
Section titled “Authentication Flow”- Middleware Layer: Route-level protection and user context setup
- API Layer: Server-side authentication enforcement via
BaseAPIHandler - Page Layer: UI-level checks via
@repo/auth/astro(for display only)
Admin Access Control
Section titled “Admin Access Control”- System Admin: Global admin role (
'admin'inuser.publicMetadata.roles) - Organization Admin: Organization-specific admin role (
'org:admin','owner','org:owner') - API Enforcement: All admin checks enforced server-side
- UI Display: Admin UI elements controlled by
@repo/auth/astroutilities
Organization Context
Section titled “Organization Context”- Required Routes: Must have organization context (e.g.,
/billing,/organization) - Optional Routes: Can work with or without organization context (e.g.,
/dashboard,/orders) - Admin Routes: Always require organization context for proper role checking
📋 Usage Guidelines
Section titled “📋 Usage Guidelines”For New Features
Section titled “For New Features”- Middleware: Use
createAuthMiddleware()with appropriate config - API Routes: Extend
BaseAPIHandlerfor authentication - Pages: Use
@repo/auth/astroutilities for user context - Admin Access: Implement via
requireAdmin()in API layer
For Existing Code
Section titled “For Existing Code”- Audit: Check for direct metadata access or bypass patterns
- Update: Replace with centralized utilities
- Test: Verify authentication and authorization still work
- Document: Update any custom auth logic documentation
🧪 Verification Commands
Section titled “🧪 Verification Commands”Test Commands
Section titled “Test Commands”# Test auth packagecd packages/auth && pnpm test
# Test webapp buildpnpm --filter webapp build
# Test CRM buildpnpm --filter crm build
# Test all appspnpm buildVerification Checklist
Section titled “Verification Checklist”- All tests pass in
@repo/authpackage - Webapp builds successfully with new middleware
- CRM builds successfully with new middleware
- No TypeScript errors in authentication code
- Middleware chaining works correctly
- Organization context handling works as expected
🎉 Summary
Section titled “🎉 Summary”The webapp authentication audit and middleware consolidation has been completely successful:
- ✅ Zero Inconsistencies: All authentication code uses centralized utilities
- ✅ Complete Consolidation: Single enhanced middleware used by all apps
- ✅ Enhanced Features: Organization context, advanced route handling
- ✅ Middleware Chaining: Separation of auth and security concerns
- ✅ Package Centralization: Astro utilities moved to
@repo/auth/astro - ✅ Comprehensive Testing: All tests pass, builds successful
- ✅ Full Documentation: Architecture guide and audit summary created
The authentication architecture is now production-ready, maintainable, and scalable for future applications in the monorepo.
Next Steps: The consolidated middleware can now be used by other applications (marketing, pdf-api, etc.) as they are developed, ensuring consistent authentication behavior across the entire platform.