// middleware/auth.middleware.ts
import { Injectable, NestMiddleware, UnauthorizedException } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthMiddleware implements NestMiddleware {
constructor(private jwtService: JwtService) {}
use(req: Request, res: Response, next: NextFunction) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return next();
}
const [scheme, token] = authHeader.split(' ');
if (scheme !== 'Bearer') {
throw new UnauthorizedException('Invalid auth scheme');
}
try {
const payload = this.jwtService.verify(token);
(req as any).user = payload;
} catch (error) {
throw new UnauthorizedException('Invalid token');
}
next();
}
}
// middleware/logging.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggingMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
const { method, originalUrl } = req;
const startTime = Date.now();
res.on('end', () => {
const duration = Date.now() - startTime;
console.log(
`${method} ${originalUrl} ${res.statusCode} - ${duration}ms`,
);
});
next();
}
}
// app.module.ts
import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { AppController } from './app.controller';
import { AuthMiddleware } from './middleware/auth.middleware';
import { LoggingMiddleware } from './middleware/logging.middleware';
@Module({
imports: [JwtModule.register({ secret: 'secret' })],
controllers: [AppController],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggingMiddleware)
.forRoutes('*')
.apply(AuthMiddleware)
.exclude(
{ path: 'auth/login', method: 'POST' },
{ path: 'auth/register', method: 'POST' },
)
.forRoutes('*');
}
}