typescript-express-starter
Version:
Quick and Easy TypeScript Express Starter
78 lines (70 loc) • 2.37 kB
text/typescript
import { Request, Response, NextFunction } from 'express';
import { verify, TokenExpiredError, JsonWebTokenError } from 'jsonwebtoken';
import { container } from 'tsyringe';
import { JWT_SECRET } from '@config/env';
import { HttpException } from '@exceptions/http.exception';
import { UsersRepository } from '@repositories/user.repository';
import { logger } from '@utils/logger';
// JWT Payload 타입 정의
interface JwtPayload {
id: string;
email: string;
iat?: number;
exp?: number;
[key: string]: unknown;
}
export interface AuthRequest extends Request {
user?: {
id: string;
email: string;
firstName?: string | null;
lastName?: string | null;
isActive: boolean;
};
}
const getAuthorization = (req: Request) => {
const cookie = req.cookies?.['Authorization'];
if (cookie) return cookie;
const header = req.header('Authorization');
if (header && header.startsWith('Bearer ')) {
return header.replace('Bearer ', '').trim();
}
return null;
};
export const AuthMiddleware = async (req: Request, res: Response, next: NextFunction) => {
try {
const token = getAuthorization(req);
if (!token) {
return next(new HttpException(401, 'Authentication token missing'));
}
let payload: JwtPayload;
try {
payload = verify(token, JWT_SECRET) as JwtPayload;
} catch (err) {
if (err instanceof TokenExpiredError) {
return next(new HttpException(401, 'Authentication token expired'));
}
if (err instanceof JsonWebTokenError) {
return next(new HttpException(401, 'Invalid authentication token'));
}
return next(new HttpException(401, 'Authentication failed'));
}
const userRepo = container.resolve(UsersRepository);
const findUser = await userRepo.findById(payload.id);
if (!findUser || !findUser.isActive) {
return next(new HttpException(401, 'User not found or inactive'));
}
// 사용자 정보를 요청 객체에 추가 (비밀번호 제외)
(req as AuthRequest).user = {
id: findUser.id,
email: findUser.email,
firstName: findUser.firstName,
lastName: findUser.lastName,
isActive: findUser.isActive,
};
next();
} catch (error) {
logger.error({ error }, 'Authentication error:');
next(new HttpException(500, 'Authentication middleware error'));
}
};