mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-20 11:53:40 +02:00
1. SecurityEventsService: Centralized audit logging for all auth events (login, register, logout, password changes, API key operations, SSO token exchange, etc.). Fire-and-forget pattern ensures auth flows are never blocked by logging failures. 2. AccountLockoutService: Locks accounts after 5 failed login attempts within 15 minutes. 30-minute lockout duration. Fails open on DB errors. Clears attempts on successful login. Email-not-verified does not count as a failed attempt. 3. API Key validation endpoint secured with rate limiting (10 req/min per IP via ThrottlerGuard) and audit logging. Key prefixes logged for forensics, never full keys. New schema: auth.login_attempts table for tracking failed logins. 174 tests passing across all auth and security modules. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
import { Module } from '@nestjs/common';
|
|
import { ConfigModule } from '@nestjs/config';
|
|
import { ThrottlerModule } from '@nestjs/throttler';
|
|
import { APP_FILTER } from '@nestjs/core';
|
|
import configuration from './config/configuration';
|
|
import { AdminModule } from './admin/admin.module';
|
|
import { AiModule } from './ai/ai.module';
|
|
import { ApiKeysModule } from './api-keys/api-keys.module';
|
|
import { AuthModule } from './auth/auth.module';
|
|
import { CreditsModule } from './credits/credits.module';
|
|
import { FeedbackModule } from './feedback/feedback.module';
|
|
import { GiftsModule } from './gifts/gifts.module';
|
|
import { HealthModule } from './health/health.module';
|
|
import { SettingsModule } from './settings/settings.module';
|
|
import { StorageModule } from './storage/storage.module';
|
|
import { TagsModule } from './tags/tags.module';
|
|
import { MeModule } from './me/me.module';
|
|
import { SubscriptionsModule } from './subscriptions/subscriptions.module';
|
|
import { StripeModule } from './stripe/stripe.module';
|
|
import { AnalyticsModule } from './analytics';
|
|
import { MetricsModule } from './metrics';
|
|
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
|
|
import { LoggerModule } from './common/logger';
|
|
import { SecurityModule } from './security';
|
|
|
|
@Module({
|
|
imports: [
|
|
ConfigModule.forRoot({
|
|
isGlobal: true,
|
|
load: [configuration],
|
|
}),
|
|
ThrottlerModule.forRoot([
|
|
{
|
|
ttl: 60000, // 60 seconds
|
|
limit: 100, // 100 requests per minute
|
|
},
|
|
]),
|
|
LoggerModule,
|
|
SecurityModule,
|
|
MetricsModule,
|
|
AnalyticsModule,
|
|
AdminModule,
|
|
AiModule,
|
|
ApiKeysModule,
|
|
AuthModule,
|
|
CreditsModule,
|
|
FeedbackModule,
|
|
GiftsModule,
|
|
HealthModule,
|
|
SettingsModule,
|
|
StorageModule,
|
|
TagsModule,
|
|
MeModule,
|
|
StripeModule,
|
|
SubscriptionsModule,
|
|
],
|
|
providers: [
|
|
{
|
|
provide: APP_FILTER,
|
|
useClass: HttpExceptionFilter,
|
|
},
|
|
],
|
|
})
|
|
export class AppModule {}
|