Skip to content

Commit 85e14ae

Browse files
author
llins
authored
Merge pull request #219 from spiffamani/feat/jwt-auth-system
feat: add Redis service and rate limiting to JWT auth system (#140)
2 parents abaf108 + 8f0f617 commit 85e14ae

6 files changed

Lines changed: 62 additions & 11 deletions

File tree

backend/package-lock.json

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

backend/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@
5353
"crypto-js": "^4.2.0",
5454
"express": "^5.2.1",
5555
"fluent-ffmpeg": "^2.1.3",
56-
"helmet": "^8.1.0",
57-
"ioredis": "^5.9.2",
56+
"ioredis": "^5.10.1",
5857
"json2csv": "^6.0.0-alpha.2",
5958
"kubo-rpc-client": "^6.1.0",
6059
"multer": "^2.0.2",

backend/src/app.module.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Module } from '@nestjs/common';
2+
import { ThrottlerModule } from '@nestjs/throttler';
23
import { ConfigModule, ConfigService } from '@nestjs/config';
34
import { TypeOrmModule } from '@nestjs/typeorm';
45
import { ScheduleModule } from '@nestjs/schedule';
@@ -72,7 +73,10 @@ import { WebSocketModule } from './websocket/websocket.module';
7273
],
7374
envFilePath: '.env',
7475
}),
75-
76+
ThrottlerModule.forRoot([{
77+
ttl: 60000,
78+
limit: 5,
79+
}]),
7680
// Scheduler Module
7781
ScheduleModule.forRoot(),
7882

backend/src/auth/auth.controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Req,
99
} from '@nestjs/common';
1010
import type { Request } from 'express';
11+
import { Throttle } from '@nestjs/throttler';
1112
import { AuthService } from './auth.service';
1213
import {
1314
RegisterDto,
@@ -25,6 +26,7 @@ import { CurrentUser } from './decorators/current-user.decorator';
2526
import { User } from '../modules/users/entities/user.entity';
2627
import { DeviceFingerprintUtil } from './utils/device-fingerprint.util';
2728

29+
@Throttle({ default: { limit: 5, ttl: 60000 } })
2830
@Controller('auth')
2931
export class AuthController {
3032
constructor(private readonly authService: AuthService) {}
@@ -102,4 +104,4 @@ export class AuthController {
102104
await this.authService.resetPassword(resetPasswordDto);
103105
return { message: 'Password reset successfully' };
104106
}
105-
}
107+
}

backend/src/auth/auth.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { RolesService } from './services/roles.service';
2525
import { RolesController } from './controllers/roles.controller';
2626
import { PermissionsService } from './services/permissions.service';
2727
import { RolesPermissionsSeeder } from './seeds/roles-permissions.seed';
28+
import { RedisService } from './services/redis.service';
2829
import { SmsModule } from '../modules/sms/sms.module';
2930
import { EmailModule } from '../modules/email/email.module';
3031
import { EmailService as AppEmailService } from '../modules/email/email.service';
@@ -85,14 +86,15 @@ import { EmailService as AppEmailService } from '../modules/email/email.service'
8586
EmailModule,
8687
],
8788
controllers: [AuthController, RolesController],
88-
providers: [
89+
providers: [
8990
AuthService,
9091
JwtStrategy,
9192
JwtAuthGuard,
9293
RolesGuard,
9394
RolesService,
9495
PermissionsService,
9596
RolesPermissionsSeeder,
97+
RedisService,
9698
{
9799
provide: EMAIL_SERVICE,
98100
useExisting: AppEmailService,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2+
import { ConfigService } from '@nestjs/config';
3+
import Redis from 'ioredis';
4+
5+
@Injectable()
6+
export class RedisService implements OnModuleInit, OnModuleDestroy {
7+
private client: Redis;
8+
9+
constructor(private readonly configService: ConfigService) {}
10+
11+
onModuleInit() {
12+
this.client = new Redis({
13+
host: this.configService.get<string>('REDIS_HOST') || 'localhost',
14+
port: this.configService.get<number>('REDIS_PORT') || 6379,
15+
password: this.configService.get<string>('REDIS_PASSWORD') || undefined,
16+
});
17+
}
18+
19+
onModuleDestroy() {
20+
this.client.disconnect();
21+
}
22+
23+
async set(key: string, value: string, ttlSeconds: number): Promise<void> {
24+
await this.client.set(key, value, 'EX', ttlSeconds);
25+
}
26+
27+
async get(key: string): Promise<string | null> {
28+
return this.client.get(key);
29+
}
30+
31+
async del(key: string): Promise<void> {
32+
await this.client.del(key);
33+
}
34+
35+
async exists(key: string): Promise<boolean> {
36+
const result = await this.client.exists(key);
37+
return result === 1;
38+
}
39+
}

0 commit comments

Comments
 (0)