Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const responseTime = require("response-time");
const { config } = require("./config/env");
const { errorHandler, notFound } = require("./middlewares/error.middleware");
const logger = require("./utils/logger");
const { apiLimiter } = require("./config/rateLimiter");

const adminRoutes = require("./routes/admin.routes");

Expand Down Expand Up @@ -48,6 +49,15 @@ const createApp = () => {
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Request logging middleware
app.use((req, res, next) => {
// logger.info(`${req.method} ${req.path}`);
next();
});

// Apply rate limiting to all API routes
app.use("/api/", apiLimiter);

// Health check endpoint
app.get("/health", (req, res) => {
res.status(200).json({
Expand Down
39 changes: 39 additions & 0 deletions src/config/rateLimiter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const rateLimit = require('express-rate-limit');

// Authentication endpoints (login) - strict limiting
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 5, // 5 requests per windowMs
message: {
success: false,
message: 'Too many authentication attempts. Please try again later.',
},
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
});

// Registration endpoint - more strict to prevent spam accounts
const registerLimiter = rateLimit({
windowMs: 60 * 60 * 1000, // 60 minutes
max: 3, // 3 requests per windowMs
message: {
success: false,
message: 'Too many registration attempts. Please try again later.',
},
standardHeaders: true,
legacyHeaders: false,
});

// General API endpoints - lenient limiting
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // 100 requests per windowMs
message: {
success: false,
message: 'Too many requests from this IP. Please try again later.',
},
standardHeaders: true,
legacyHeaders: false,
});

module.exports = { authLimiter, registerLimiter, apiLimiter };
4 changes: 3 additions & 1 deletion src/routes/auth.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const express = require("express");
const router = express.Router();
const authController = require("../controllers/auth.controller");
const { authenticate } = require("../middlewares/auth.middleware");
const { authLimiter, registerLimiter } = require("../config/rateLimiter");

/**
* @route POST /api/auth/register
Expand All @@ -10,6 +11,7 @@ const { authenticate } = require("../middlewares/auth.middleware");
*/
router.post(
"/register",
registerLimiter,
authController.validateRegister,
authController.register
);
Expand All @@ -19,7 +21,7 @@ router.post(
* @desc Login user
* @access Public
*/
router.post("/login", authController.validateLogin, authController.login);
router.post("/login", authLimiter, authController.validateLogin, authController.login);

/**
* @route POST /api/auth/forgot-password
Expand Down