From 2fa76ec60bae7ec5fcc3da2a5694a667ab51d735 Mon Sep 17 00:00:00 2001 From: Suhyun Park Date: Wed, 17 Jul 2024 01:30:35 +0900 Subject: [PATCH] fix: login/logout --- src/api/auth/credentials/$get.ts | 13 +++++++++++++ src/api/auth/credentials/index.ts | 8 ++++++++ src/api/auth/index.ts | 4 ++++ src/api/auth/login/$post.ts | 5 ++++- src/api/auth/logout/$post.ts | 8 ++++++++ src/api/auth/logout/index.ts | 8 ++++++++ src/middlewares/auth.ts | 8 ++++++++ src/model/user/types.ts | 15 +++++++++++++++ 8 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/api/auth/credentials/$get.ts create mode 100644 src/api/auth/credentials/index.ts create mode 100644 src/api/auth/logout/$post.ts create mode 100644 src/api/auth/logout/index.ts create mode 100644 src/model/user/types.ts diff --git a/src/api/auth/credentials/$get.ts b/src/api/auth/credentials/$get.ts new file mode 100644 index 0000000..a76256f --- /dev/null +++ b/src/api/auth/credentials/$get.ts @@ -0,0 +1,13 @@ +import { RequestHandler } from "express"; +import { toUserResponse } from "src/model/user/types"; + +const handler: RequestHandler = (req, res) => { + if (!req.user) { + res.status(401).send("Unauthorized"); + return; + } + + res.send(toUserResponse(req.user)); +}; + +export default handler; diff --git a/src/api/auth/credentials/index.ts b/src/api/auth/credentials/index.ts new file mode 100644 index 0000000..3ccf234 --- /dev/null +++ b/src/api/auth/credentials/index.ts @@ -0,0 +1,8 @@ +import { Router } from "express"; +import $get from "./$get"; + +const router = Router(); + +router.get("/", $get); + +export default router; diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts index bb39e84..f9a54ce 100644 --- a/src/api/auth/index.ts +++ b/src/api/auth/index.ts @@ -1,8 +1,12 @@ import { Router } from "express"; import login from "./login"; +import logout from "./logout"; +import credentials from "./credentials"; const router = Router(); +router.use("/credentials", credentials); router.use("/login", login); +router.use("/logout", logout); export default router; diff --git a/src/api/auth/login/$post.ts b/src/api/auth/login/$post.ts index ae965eb..3f4e665 100644 --- a/src/api/auth/login/$post.ts +++ b/src/api/auth/login/$post.ts @@ -30,7 +30,10 @@ const login: RequestHandler = async (req, res) => { } const jwt = UserToJWT(user, new Date(Date.now() + 1000 * 60 * 60 * 24 * 7)); // 7 days - res.header("Authorization", `Bearer ${jwt}`).sendStatus(200); + res.cookie("Authorization", jwt, { + signed: true, + }); + res.sendStatus(200); }; export default login; diff --git a/src/api/auth/logout/$post.ts b/src/api/auth/logout/$post.ts new file mode 100644 index 0000000..4c7b6ca --- /dev/null +++ b/src/api/auth/logout/$post.ts @@ -0,0 +1,8 @@ +import { RequestHandler } from "express"; + +const logout: RequestHandler = (req, res) => { + res.clearCookie("Authorization"); + res.sendStatus(200); +}; + +export default logout; diff --git a/src/api/auth/logout/index.ts b/src/api/auth/logout/index.ts new file mode 100644 index 0000000..a390fd0 --- /dev/null +++ b/src/api/auth/logout/index.ts @@ -0,0 +1,8 @@ +import { Router } from "express"; +import $post from "./$post"; + +const router = Router(); + +router.post("/", $post); + +export default router; diff --git a/src/middlewares/auth.ts b/src/middlewares/auth.ts index 42510c2..88bc57b 100644 --- a/src/middlewares/auth.ts +++ b/src/middlewares/auth.ts @@ -1,6 +1,11 @@ import { RequestHandler } from "express"; +import { Record, String } from "runtypes"; import { JWTToUser } from "../utils/jwt"; +const Cookie = Record({ + Authorization: String, +}); + const Auth: RequestHandler = async (req, res, next) => { let token: string | null = null; if (req.headers.authorization) { @@ -9,6 +14,9 @@ const Auth: RequestHandler = async (req, res, next) => { token = auth.substring(7); } } + if (Cookie.guard(req.signedCookies)) { + token = req.signedCookies.Authorization; + } if (token !== null) { try { diff --git a/src/model/user/types.ts b/src/model/user/types.ts new file mode 100644 index 0000000..11e914c --- /dev/null +++ b/src/model/user/types.ts @@ -0,0 +1,15 @@ +import { User } from "@prisma/client"; + +export const toUserResponse = ({ + userId, + loginId, + displayName, + isHost, +}: User) => { + return { + userId, + loginId, + displayName, + isHost, + }; +};