From 99753b4a215f49d82cae9ef5ca113982fb04b873 Mon Sep 17 00:00:00 2001 From: potados99 Date: Tue, 8 Feb 2022 01:30:41 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=97=AC=EB=B6=80=EB=A5=BC=20defineRoute?= =?UTF-8?q?=EC=97=90=20=ED=91=9C=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entity/User.ts | 2 +- src/server/middleware/authorizer.ts | 44 +------------------ src/server/middleware/userIdGetterAssigner.ts | 42 ++++++++++++++++++ src/server/routes/comments/deleteComment.ts | 3 +- src/server/routes/comments/getComment.ts | 2 +- src/server/routes/comments/makeComment.ts | 3 +- src/server/routes/comments/updateComment.ts | 3 +- src/server/routes/events/deleteEvent.ts | 3 +- src/server/routes/events/makeEvent.ts | 3 +- src/server/routes/events/updateEvent.ts | 3 +- src/server/routes/me.ts | 10 ----- src/server/routes/users/deleteUser.ts | 3 +- src/server/routes/users/getMe.ts | 3 +- src/server/routes/users/updateUser.ts | 3 +- src/server/server.ts | 12 +---- src/{server/routes/users => service}/types.ts | 0 16 files changed, 66 insertions(+), 73 deletions(-) create mode 100644 src/server/middleware/userIdGetterAssigner.ts delete mode 100644 src/server/routes/me.ts rename src/{server/routes/users => service}/types.ts (100%) diff --git a/src/entity/User.ts b/src/entity/User.ts index a005324..fc3adf1 100644 --- a/src/entity/User.ts +++ b/src/entity/User.ts @@ -1,7 +1,7 @@ import {BaseEntity, Column, CreateDateColumn, Entity, OneToMany, PrimaryGeneratedColumn} from 'typeorm'; import Event from './Event'; import Comment from './Comment'; -import {UserReponse} from '../server/routes/users/types'; +import {UserReponse} from '../service/types'; /** * 사용자! diff --git a/src/server/middleware/authorizer.ts b/src/server/middleware/authorizer.ts index dcb186c..1ab8ea5 100644 --- a/src/server/middleware/authorizer.ts +++ b/src/server/middleware/authorizer.ts @@ -4,30 +4,15 @@ import config from '../../config'; import {decodeJwt} from '../../common/utils/token'; import PathMatcher from '../libs/PathMatcher'; -export type AuthorizerConfig = { - exclude?: string[]; -}; - -export function authorizer({exclude}: AuthorizerConfig): RequestHandler { - const exclududPathMatcher = new PathMatcher(exclude); - +export function authorizer(): RequestHandler { return (req, res, next) => { - if (exclududPathMatcher.anyMatch(req.path)) { - assignGetter(req, extractUserIdIfJwtExists(req)); - - return next(); - } - const jwtInRequest = extractJwt(req); if (jwtInRequest == null) { return next(NotLoggedIn()); } try { - const {userId} = decodeJwt(jwtInRequest); - - assignGetter(req, userId); - + decodeJwt(jwtInRequest); return next(); } catch (e) { return next(InvalidJwt()); @@ -35,31 +20,6 @@ export function authorizer({exclude}: AuthorizerConfig): RequestHandler { }; } -function assignGetter(req: express.Request, initial?: number) { - Object.defineProperty(req, 'userId', { - get() { - if (initial) { - return initial; - } else { - throw NotLoggedIn(); - } - }, - }); -} - function extractJwt(req: express.Request): string | undefined { return req.header('token') ?? req.cookies[config.server.jwt.cookieName]; } - -function extractUserIdIfJwtExists(req: express.Request): number | undefined { - const jwt = extractJwt(req); - if (jwt == null) { - return undefined; - } - - try { - return decodeJwt(jwt).userId; - } catch (e) { - return undefined; - } -} diff --git a/src/server/middleware/userIdGetterAssigner.ts b/src/server/middleware/userIdGetterAssigner.ts new file mode 100644 index 0000000..93d6f75 --- /dev/null +++ b/src/server/middleware/userIdGetterAssigner.ts @@ -0,0 +1,42 @@ +import express, {RequestHandler} from 'express'; +import {InvalidJwt, NotLoggedIn} from '../../common/errors/general'; +import config from '../../config'; +import {decodeJwt} from '../../common/utils/token'; +import PathMatcher from '../libs/PathMatcher'; + +export function userIdGetterAssigner(): RequestHandler { + return (req, res, next) => { + const jwtInRequest = extractJwt(req); + if (jwtInRequest == null) { + assignGetter(req); + + return next(); + } + + try { + const {userId} = decodeJwt(jwtInRequest); + + assignGetter(req, userId); + + return next(); + } catch (e) { + return next(); + } + }; +} + +function assignGetter(req: express.Request, initial?: number) { + Object.defineProperty(req, 'userId', { + get() { + if (initial) { + return initial; + } else { + throw NotLoggedIn(); + } + }, + }); +} + +function extractJwt(req: express.Request): string | undefined { + return req.header('token') ?? req.cookies[config.server.jwt.cookieName]; +} diff --git a/src/server/routes/comments/deleteComment.ts b/src/server/routes/comments/deleteComment.ts index 38cfd2d..33e7e1a 100644 --- a/src/server/routes/comments/deleteComment.ts +++ b/src/server/routes/comments/deleteComment.ts @@ -2,6 +2,7 @@ import {defineSchema} from '../../libs/schema'; import {defineRoute} from '../../libs/route'; import CommentService from '../../../service/CommentService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -9,7 +10,7 @@ const schema = defineSchema({ }, }); -export default defineRoute('delete', '/comments/:commentId', schema, async (req, res) => { +export default defineRoute('delete', '/comments/:commentId', schema, authorizer(), async (req, res) => { const {commentId} = req.params; await CommentService.deleteComment(commentId); diff --git a/src/server/routes/comments/getComment.ts b/src/server/routes/comments/getComment.ts index 8481403..de27ea0 100644 --- a/src/server/routes/comments/getComment.ts +++ b/src/server/routes/comments/getComment.ts @@ -9,7 +9,7 @@ const schema = defineSchema({ }, }); -export default defineRoute('get', '/comments/:commentId', schema, async (req, res) => { +export default defineRoute('get', '/comment/:commentId', schema, async (req, res) => { const {commentId} = req.params; const commentInformation = await CommentService.getComment(commentId); diff --git a/src/server/routes/comments/makeComment.ts b/src/server/routes/comments/makeComment.ts index 64bf2e0..4fea62c 100644 --- a/src/server/routes/comments/makeComment.ts +++ b/src/server/routes/comments/makeComment.ts @@ -5,6 +5,7 @@ import CommentService from '../../../service/CommentService'; import UserService from '../../../service/UserService'; import EventService from '../../../service/EventService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ body: { @@ -13,7 +14,7 @@ const schema = defineSchema({ } }); -export default defineRoute('post', '/comments', schema, async (req, res) => { +export default defineRoute('post', '/comments', schema, authorizer(), async (req, res) => { console.log('make coomet!'); const {userId} = req; diff --git a/src/server/routes/comments/updateComment.ts b/src/server/routes/comments/updateComment.ts index 2b2a9cb..131cadd 100644 --- a/src/server/routes/comments/updateComment.ts +++ b/src/server/routes/comments/updateComment.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import {defineRoute} from '../../libs/route'; import CommentService from '../../../service/CommentService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -13,7 +14,7 @@ const schema = defineSchema({ } }); -export default defineRoute('patch', '/comments/:commentId', schema, async (req, res) => { +export default defineRoute('patch', '/comments/:commentId', schema, authorizer(), async (req, res) => { const {commentId} = req.params; await CommentService.patchComment(commentId, req.body); diff --git a/src/server/routes/events/deleteEvent.ts b/src/server/routes/events/deleteEvent.ts index 57671cb..5552823 100644 --- a/src/server/routes/events/deleteEvent.ts +++ b/src/server/routes/events/deleteEvent.ts @@ -2,6 +2,7 @@ import {defineSchema} from '../../libs/schema'; import {defineRoute} from '../../libs/route'; import EventService from '../../../service/EventService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -9,7 +10,7 @@ const schema = defineSchema({ }, }); -export default defineRoute('delete', '/events/:eventId', schema, async (req, res) => { +export default defineRoute('delete', '/events/:eventId', schema, authorizer(), async (req, res) => { const {eventId} = req.params; await EventService.deleteEvent(eventId); diff --git a/src/server/routes/events/makeEvent.ts b/src/server/routes/events/makeEvent.ts index 1473f9b..a4db825 100644 --- a/src/server/routes/events/makeEvent.ts +++ b/src/server/routes/events/makeEvent.ts @@ -4,6 +4,7 @@ import {defineRoute} from '../../libs/route'; import EventService from '../../../service/EventService'; import UserService from '../../../service/UserService'; import {stringAsDate} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ body: { @@ -17,7 +18,7 @@ const schema = defineSchema({ } }); -export default defineRoute('post', '/events', schema, async (req, res) => { +export default defineRoute('post', '/events', schema, authorizer(), async (req, res) => { console.log('make Event!'); const {userId} = req; diff --git a/src/server/routes/events/updateEvent.ts b/src/server/routes/events/updateEvent.ts index 130f2c0..808b373 100644 --- a/src/server/routes/events/updateEvent.ts +++ b/src/server/routes/events/updateEvent.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import {defineRoute} from '../../libs/route'; import EventService from '../../../service/EventService'; import {stringAsDate, stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -19,7 +20,7 @@ const schema = defineSchema({ } }); -export default defineRoute('patch', '/events/:eventId?', schema, async (req, res) => { +export default defineRoute('patch', '/events/:eventId?', schema, authorizer(), async (req, res) => { const {eventId} = req.params; await EventService.patchEvent(eventId, req.body); diff --git a/src/server/routes/me.ts b/src/server/routes/me.ts deleted file mode 100644 index 9eab789..0000000 --- a/src/server/routes/me.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {defineSchema} from '../libs/schema'; -import {defineRoute} from '../libs/route'; - -const schema = defineSchema({}); - -export default defineRoute('get', '/me', schema, async (req, res) => { - const {userId} = req; - - return res.send(`당신 사용자 ID는 ${userId}`); -}); diff --git a/src/server/routes/users/deleteUser.ts b/src/server/routes/users/deleteUser.ts index 81c23fe..8747f9f 100644 --- a/src/server/routes/users/deleteUser.ts +++ b/src/server/routes/users/deleteUser.ts @@ -2,6 +2,7 @@ import {defineSchema} from '../../libs/schema'; import {defineRoute} from '../../libs/route'; import UserService from '../../../service/UserService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -9,7 +10,7 @@ const schema = defineSchema({ }, }); -export default defineRoute('delete', '/users/:id', schema, async (req, res) => { +export default defineRoute('delete', '/users/:id', schema, authorizer(), async (req, res) => { const {id} = req.params; await UserService.deleteUser(id); diff --git a/src/server/routes/users/getMe.ts b/src/server/routes/users/getMe.ts index bbeee70..a0027e6 100644 --- a/src/server/routes/users/getMe.ts +++ b/src/server/routes/users/getMe.ts @@ -2,11 +2,12 @@ import {defineSchema} from '../../libs/schema'; import {defineRoute} from '../../libs/route'; import UserService from '../../../service/UserService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ }); -export default defineRoute('get', '/me', schema, async (req, res) => { +export default defineRoute('get', '/me', schema, authorizer(), async (req, res) => { const {userId} = req; const user = await UserService.getUser(userId); diff --git a/src/server/routes/users/updateUser.ts b/src/server/routes/users/updateUser.ts index f7a8c9a..197ca8d 100644 --- a/src/server/routes/users/updateUser.ts +++ b/src/server/routes/users/updateUser.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import {defineRoute} from '../../libs/route'; import UserService from '../../../service/UserService'; import {stringAsInt} from '../../libs/zodTypes'; +import {authorizer} from '../../middleware/authorizer'; const schema = defineSchema({ params: { @@ -13,7 +14,7 @@ const schema = defineSchema({ } }); -export default defineRoute('patch', '/users/:id', schema, async (req, res) => { +export default defineRoute('patch', '/users/:id', schema, authorizer(), async (req, res) => { const {id} = req.params; await UserService.patchUser(id, req.body); diff --git a/src/server/server.ts b/src/server/server.ts index 965ba46..91da92b 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,16 +1,8 @@ import express from 'express'; import cookieParser from 'cookie-parser'; -import {authorizer} from './middleware/authorizer'; import {errorHandler} from './middleware/errorHandler'; import {registerRoutes} from '../common/utils/express'; - -/** - * 인증을 건너뛰는 endpoint 목록입니다. - */ -const allowList = [ - '/**', // 전체 경로 허용입니다 나중에 빼주세용~ - '/login' -]; +import {userIdGetterAssigner} from './middleware/userIdGetterAssigner'; export async function startServer() { const app = express(); @@ -19,7 +11,7 @@ export async function startServer() { app.use(express.json()); app.use(express.urlencoded({extended: true})); - app.use(authorizer({exclude: allowList})); + app.use(userIdGetterAssigner()); await registerRoutes(app, __dirname + '/routes'); diff --git a/src/server/routes/users/types.ts b/src/service/types.ts similarity index 100% rename from src/server/routes/users/types.ts rename to src/service/types.ts