Skip to content

Commit 38b92c4

Browse files
committed
feat: add auth rate limiting
1 parent 6a05cf7 commit 38b92c4

4 files changed

Lines changed: 50 additions & 7 deletions

File tree

apps/core-api/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"cookie-parser": "^1.4.7",
2525
"dotenv": "^17.2.3",
2626
"express": "^5.2.1",
27+
"express-rate-limit": "^8.5.1",
2728
"ioredis": "^5.10.1",
2829
"jsonwebtoken": "^9.0.3",
2930
"meilisearch": "^0.55.0",
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { rateLimit } from 'express-rate-limit';
2+
3+
export const authLimiter = rateLimit({
4+
windowMs: 15 * 60 * 1000, // 15 minutes
5+
max: 10, // Limit each IP to 10 requests per windowMs
6+
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
7+
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
8+
message: {
9+
success: false,
10+
message: "Too many authentication attempts. Please try again later.",
11+
},
12+
handler: (req, res, next, options) => {
13+
res.status(429).json(options.message);
14+
},
15+
});

apps/core-api/src/routes/auth.routes.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ import { Router } from "express";
22

33
import { forgotPasswordController, loginController, logoutController, pendingProfileController, refreshTokenController, resendSignupOtpController, resetPasswordController, signupController, verifyResetOtpController, verifySignupOtpController } from "../controllers/auth.controller.js";
44
import { authenticate } from "../middlewares/auth.middleware.js";
5+
import { authLimiter } from "../middlewares/rateLimit.middleware.js";
56

67
const router: Router = Router()
7-
router.post("/login", loginController)
8-
router.post("/signup", signupController);
8+
router.post("/login", authLimiter, loginController)
9+
router.post("/signup", authLimiter, signupController);
910
router.post("/refresh", refreshTokenController);
1011
router.post("/logout", authenticate, logoutController);
11-
router.post("/verify-signup-otp", verifySignupOtpController);
12-
router.post("/resend-signup-otp", resendSignupOtpController);
13-
router.post("/forgot-password", forgotPasswordController);
14-
router.post("/verify-reset-otp", verifyResetOtpController);
15-
router.post("/reset-password", resetPasswordController);
12+
router.post("/verify-signup-otp", authLimiter, verifySignupOtpController);
13+
router.post("/resend-signup-otp", authLimiter, resendSignupOtpController);
14+
router.post("/forgot-password", authLimiter, forgotPasswordController);
15+
router.post("/verify-reset-otp", authLimiter, verifyResetOtpController);
16+
router.post("/reset-password", authLimiter, resetPasswordController);
1617
router.post("/pending-profile", pendingProfileController);
1718

1819

pnpm-lock.yaml

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)