Files
livedash-node/middleware/authRateLimit.ts
Kaj Kowalski fa7e815a3b feat: complete tRPC integration and fix platform UI issues
- Implement comprehensive tRPC setup with type-safe API
- Create tRPC routers for dashboard, admin, and auth endpoints
- Migrate frontend components to use tRPC client
- Fix platform dashboard Settings button functionality
- Add platform settings page with profile and security management
- Create OpenAI API mocking infrastructure for cost-safe testing
- Update tests to work with new tRPC architecture
- Sync database schema to fix AIBatchRequest table errors
2025-07-12 00:27:57 +02:00

47 lines
1.3 KiB
TypeScript

import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { extractClientIP, InMemoryRateLimiter } from "../lib/rateLimiter";
// Rate limiting for login attempts
const loginRateLimiter = new InMemoryRateLimiter({
maxAttempts: 5, // 5 login attempts
windowMs: 15 * 60 * 1000, // 15 minutes
maxEntries: 10000,
cleanupIntervalMs: 5 * 60 * 1000, // 5 minutes
});
/**
* Apply rate limiting to authentication endpoints
*/
export function authRateLimitMiddleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// Only apply to NextAuth signin endpoint
if (
pathname.startsWith("/api/auth/signin") ||
pathname.startsWith("/api/auth/callback/credentials")
) {
const ip = extractClientIP(request);
const rateLimitResult = loginRateLimiter.checkRateLimit(ip);
if (!rateLimitResult.allowed) {
return NextResponse.json(
{
success: false,
error: "Too many login attempts. Please try again later.",
},
{
status: 429,
headers: {
"Retry-After": String(
Math.ceil((rateLimitResult.resetTime! - Date.now()) / 1000)
),
},
}
);
}
}
return NextResponse.next();
}