Skip to content

🔍 Webapp Authentication Audit Summary

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.

  • src/middleware.ts - Route-level authentication and admin checks
  • src/lib/api/base-handler.ts - API route base class with auth utilities
  • src/layouts/AdminLayout.astro - Admin layout with role checking
  • src/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.

  • @repo/auth imports (core authentication package)
  • @/lib/api/base-handler imports (API route base class)
  • @/lib/astro-auth-utils imports (page-level utilities)
  • Direct locals.user access patterns
  • Direct publicMetadata.roles checks
  • 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
  • Status: ✅ EXCELLENT
  • Pattern: 100% of API routes use BaseAPIHandler
  • Functions: requireAuth(), requireAdmin(), handleRequest()
  • Security: Server-side authentication and authorization enforcement
  • Status: ✅ EXCELLENT
  • Pattern: All pages use @repo/auth/astro (centralized package)
  • Functions: getUser(), getUserId(), requireAdmin()
  • Security: UI-level checks with server-side enforcement

The audit revealed zero instances of:

  • Direct locals.user access bypassing centralized utilities
  • Direct publicMetadata.roles checks for admin validation
  • Custom authentication logic that duplicates centralized functions
  • Inconsistent import patterns across the application

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...`

Enhanced shared middleware with comprehensive CSP configuration:

  1. Configurable CSP Options: Added cspConfig to MiddlewareConfig interface
  2. Clerk Domain Support: Comprehensive Clerk domain allowlist including wildcards
  3. Service Integration: Built-in support for Stripe, Sentry, Google services
  4. Flexible Configuration: Each app can customize CSP domains as needed
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
}
  • 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
  • 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”

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

Both webapp and CRM now use Astro’s built-in sequence() function to combine:

  1. Auth Middleware: Route protection and user context
  2. 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
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
};
const config = {
protectedRoutes: ['/dashboard', '/companies', '/contacts', '/tasks'],
publicRoutes: ['/', '/sign-in', '/sign-up'],
adminRoutes: [], // No admin routes yet
enableOrganizationContext: false, // Simple auth only
};
  • 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
  • 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
  • Before: Single middleware handling all concerns
  • After: Chained middleware for separation of concerns
  • Benefits: Modularity, easier testing, flexible security features
  • Before: Astro utilities scattered across apps
  • After: Centralized in @repo/auth/astro package
  • Benefits: Reusability, consistent maintenance, better testing
  • File: docs/authentication-architecture.md
  • Purpose: Comprehensive guide for developers on authentication architecture
  • Content: Architecture layers, available utilities, security considerations, migration guide
  • File: docs/webapp-auth-audit-summary.md (this document)
  • Purpose: Record of audit findings and middleware consolidation
  • Content: Audit results, improvements made, new architecture
  1. Middleware Layer: Route-level protection and user context setup
  2. API Layer: Server-side authentication enforcement via BaseAPIHandler
  3. Page Layer: UI-level checks via @repo/auth/astro (for display only)
  • System Admin: Global admin role ('admin' in user.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/astro utilities
  • 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
  • Middleware: Use createAuthMiddleware() with appropriate config
  • API Routes: Extend BaseAPIHandler for authentication
  • Pages: Use @repo/auth/astro utilities for user context
  • Admin Access: Implement via requireAdmin() in API layer
  • 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
Terminal window
# Test auth package
cd packages/auth && pnpm test
# Test webapp build
pnpm --filter webapp build
# Test CRM build
pnpm --filter crm build
# Test all apps
pnpm build
  • All tests pass in @repo/auth package
  • 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

The webapp authentication audit and middleware consolidation has been completely successful:

  1. ✅ Zero Inconsistencies: All authentication code uses centralized utilities
  2. ✅ Complete Consolidation: Single enhanced middleware used by all apps
  3. ✅ Enhanced Features: Organization context, advanced route handling
  4. ✅ Middleware Chaining: Separation of auth and security concerns
  5. ✅ Package Centralization: Astro utilities moved to @repo/auth/astro
  6. ✅ Comprehensive Testing: All tests pass, builds successful
  7. ✅ 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.