fix(api): helmet security headers + auth endpoint rate limiting

This commit is contained in:
2026-03-01 16:38:40 -06:00
parent e7da4ca25e
commit 45ce76061b
2 changed files with 10 additions and 1 deletions

View File

@@ -106,7 +106,7 @@ export class AuthController {
// @SkipCsrf avoids double-protection conflicts. // @SkipCsrf avoids double-protection conflicts.
// See: https://www.better-auth.com/docs/reference/security // See: https://www.better-auth.com/docs/reference/security
@SkipCsrf() @SkipCsrf()
@Throttle({ strict: { limit: 10, ttl: 60000 } }) @Throttle({ default: { ttl: 60_000, limit: 5 } })
async handleAuth(@Req() req: ExpressRequest, @Res() res: ExpressResponse): Promise<void> { async handleAuth(@Req() req: ExpressRequest, @Res() res: ExpressResponse): Promise<void> {
// Extract client IP for logging // Extract client IP for logging
const clientIp = this.getClientIp(req); const clientIp = this.getClientIp(req);

View File

@@ -1,6 +1,7 @@
import { NestFactory } from "@nestjs/core"; import { NestFactory } from "@nestjs/core";
import { RequestMethod, ValidationPipe } from "@nestjs/common"; import { RequestMethod, ValidationPipe } from "@nestjs/common";
import cookieParser from "cookie-parser"; import cookieParser from "cookie-parser";
import helmet from "helmet";
import { AppModule } from "./app.module"; import { AppModule } from "./app.module";
import { getTrustedOrigins } from "./auth/auth.config"; import { getTrustedOrigins } from "./auth/auth.config";
import { GlobalExceptionFilter } from "./filters/global-exception.filter"; import { GlobalExceptionFilter } from "./filters/global-exception.filter";
@@ -33,6 +34,14 @@ async function bootstrap() {
// Enable cookie parser for session handling // Enable cookie parser for session handling
app.use(cookieParser()); app.use(cookieParser());
// Enable helmet security headers
app.use(
helmet({
contentSecurityPolicy: false, // Let Next.js handle CSP
crossOriginEmbedderPolicy: false,
})
);
// Enable global validation pipe with transformation // Enable global validation pipe with transformation
app.useGlobalPipes( app.useGlobalPipes(
new ValidationPipe({ new ValidationPipe({