From b7812271726c450ad2abfdd7376d56ee42f18db5 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:34:41 +0300 Subject: [PATCH 1/2] Add logging interceptor --- src/app.module.ts | 8 ++++ src/interceptors/logging.interceptor.ts | 63 +++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/interceptors/logging.interceptor.ts diff --git a/src/app.module.ts b/src/app.module.ts index c95d1bf..0b5fd4a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -18,6 +18,8 @@ import { UserNotificationModule } from './user-notification/user-notification.mo import { DeviceMessagesSubscriptionModule } from './device-messages/device-messages.module'; import { SceneModule } from './scene/scene.module'; import { DoorLockModule } from './door-lock/door.lock.module'; +import { APP_INTERCEPTOR } from '@nestjs/core'; +import { LoggingInterceptor } from './interceptors/logging.interceptor'; @Module({ imports: [ ConfigModule.forRoot({ @@ -42,5 +44,11 @@ import { DoorLockModule } from './door-lock/door.lock.module'; DoorLockModule, ], controllers: [AuthenticationController], + providers: [ + { + provide: APP_INTERCEPTOR, + useClass: LoggingInterceptor, + }, + ], }) export class AuthModule {} diff --git a/src/interceptors/logging.interceptor.ts b/src/interceptors/logging.interceptor.ts new file mode 100644 index 0000000..e74f4c2 --- /dev/null +++ b/src/interceptors/logging.interceptor.ts @@ -0,0 +1,63 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Observable, throwError } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; + +@Injectable() +export class LoggingInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + const { method, url, body } = request; + + return next.handle().pipe( + map((response) => { + // Filter out sensitive fields from the request body + const filteredRequestBody = this.filterSensitiveFields(body); + console.log( + '-------------------------------------------------------------------', + ); + console.log(`Request Method: ${method}`); + console.log(`Request URL: ${url}`); + if ( + filteredRequestBody && + Object.keys(filteredRequestBody).length > 0 + ) { + console.log(`Request Body: ${JSON.stringify(filteredRequestBody)}`); + } + // Filter out sensitive fields from the response + const filteredResponse = this.filterSensitiveFields(response); + console.log(`Response: ${JSON.stringify(filteredResponse)}`); + return filteredResponse; + }), + catchError((error) => { + // Do not log anything if there is an error + return throwError(error); + }), + ); + } + + private filterSensitiveFields(data: any): any { + const blacklist = ['password', 'refreshToken', 'accessToken', 'otp']; + + if (data && typeof data === 'object' && !Array.isArray(data)) { + return Object.keys(data).reduce((acc, key) => { + if (blacklist.includes(key)) { + acc[key] = '[FILTERED]'; + } else if (typeof data[key] === 'object' && data[key] !== null) { + acc[key] = this.filterSensitiveFields(data[key]); + } else { + acc[key] = data[key]; + } + return acc; + }, {}); + } else if (Array.isArray(data)) { + return data.map((item) => this.filterSensitiveFields(item)); + } + + return data; + } +} From 2ff03120875887c0bee51d51e264810d3a3bfe34 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:39:31 +0300 Subject: [PATCH 2/2] Filter out sensitive fields from request and response bodies for logging --- src/interceptors/logging.interceptor.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/interceptors/logging.interceptor.ts b/src/interceptors/logging.interceptor.ts index e74f4c2..9e06186 100644 --- a/src/interceptors/logging.interceptor.ts +++ b/src/interceptors/logging.interceptor.ts @@ -15,7 +15,7 @@ export class LoggingInterceptor implements NestInterceptor { return next.handle().pipe( map((response) => { - // Filter out sensitive fields from the request body + // Filter out sensitive fields from the request body for logging const filteredRequestBody = this.filterSensitiveFields(body); console.log( '-------------------------------------------------------------------', @@ -28,10 +28,10 @@ export class LoggingInterceptor implements NestInterceptor { ) { console.log(`Request Body: ${JSON.stringify(filteredRequestBody)}`); } - // Filter out sensitive fields from the response + // Filter out sensitive fields from the response for logging const filteredResponse = this.filterSensitiveFields(response); console.log(`Response: ${JSON.stringify(filteredResponse)}`); - return filteredResponse; + return response; // Return the actual response unmodified }), catchError((error) => { // Do not log anything if there is an error