withProviders([ TinkerServiceProvider::class, ]) ->withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', then: static function (): void { Route::middleware('api') ->prefix('rss') ->group(base_path('routes/rss.php')); }, ) ->withMiddleware(function (Middleware $middleware) { $middleware->redirectTo( guests: fn () => route('login'), users: '/', ); $middleware->validateCsrfTokens(except: [ 'failed', 'btcpay/webhook', ]); $middleware->prepend(DegradeWhenRedisUnreachable::class); $middleware->append([ PreventRequestsDuringMaintenance::class, ForceJsonOnAPI::class, BlockAbusiveServices::class, // Block AIOStreams, Oracle Cloud, UsenetStreamer, Cloudflare WARP MeasureApiPerformance::class, ]); $middleware->replace( BaseTrustProxies::class, AppTrustProxies::class ); $middleware->web([ AuthenticateSession::class, EnforceSessionToken::class, TrustedDevice2FAMiddleware::class, // Add our new trusted device middleware ContentSecurityPolicy::class, // Add CSP middleware for security NoCacheForAuthenticatedUsers::class, // Prevent Cloudflare/CDN caching of authenticated pages ]); $middleware->throttleApi('60,1'); $middleware->alias([ '2fa' => Google2FAMiddleware::class, 'bindings' => SubstituteBindings::class, 'clearance' => ClearanceMiddleware::class, 'apiRateLimit' => ThrottleApiRequestsByToken::class, 'isVerified' => EnsureEmailIsVerified::class, 'permission' => PermissionMiddleware::class, 'role' => RoleMiddleware::class, 'role_or_permission' => RoleOrPermissionMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { Integration::handles($exceptions); })->create();