import jwt from "jsonwebtoken";
import { prisma } from "../models/index.js"; // Prisma client 가져오기
const ACCESS_TOKEN_SECRET_KEY = process.env.ACCESS_TOKEN_SECRET_KEY;
export default async function (req, res, next) {
try {
const { authorization } = req.cookies;
console.log(authorization); ---> 얘랑 밑에는 잘 나옴
console.log(req.cookies);
if (!authorization) throw new Error("토큰이 존재하지 않습니다.");
const [tokenType, token] = authorization.split(" ");
// 원래 같았으면 아래,,, 리팩토링한 게 위에 ---> 참고하자
// const token = authorization.split(" ");
// const tokenType = token[0];
// const tokenValue = token[1];
if (tokenType !== "Bearer")
throw new Error("토큰 타입이 일치하지 않습니다.");
const decodedAccessToken = jwt.verify(token, ACCESS_TOKEN_SECRET_KEY);
const userId = decodedAccessToken.userId;
const user = await prisma.users.findFirst({
where: { userId: +userId },
});
if (!user) {
res.clearCookie("authorization");
throw new Error("토큰 사용자가 존재하지 않습니다.");
}
// req.user에 사용자 정보를 저장합니다.
req.user = user;
if (user.role === "admin") {
}
next();
} catch (error) {
// res.clearCookie("authorization");
// 토큰이 만료되었거나, 조작되었을 때, 에러 메시지를 다르게 출력합니다.
switch (error.name) {
case "TokenExpiredError":
return res.status(401).json({ message: "토큰이 만료되었습니다." });
case "JsonWebTokenError":
return res.status(401).json({ message: "토큰이 조작되었습니다." });
default:
return res
.status(401)
.json({ message: error.message ?? "비정상적인 요청입니다." });
}
}
}
// routers/users.router.js
/** 로그인 API **/
const ACCESS_TOKEN_SECRET_KEY = process.env.ACCESS_TOKEN_SECRET_KEY;
const REFRESH_TOKEN_SECRET_KEY = process.env.REFRESH_TOKEN_SECRET_KEY;
const tokenStorage = {}; // Refresh Token을 저장할 객체
router.post("/sign-in", async (req, res, next) => {
const { clientId, email, password } = req.body;
let user;
if (clientId) {
// 카카오 로그인
user = await prisma.users.findFirst({ where: { clientId } });
if (!user)
return res.status(401).json({ message: "존재하지 않는 계정입니다." });
} else {
// 이메일 로그인
user = await prisma.users.findFirst({ where: { email } });
if (!email)
return res.status(401).json({ message: "존재하지 않는 이메일입니다." });
if (!user)
return res.status(401).json({ message: "존재하지 않는 이메일입니다." });
// 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
if (!(await bcrypt.compare(password, user.password)))
return res.status(401).json({ message: "비밀번호가 일치하지 않습니다." });
}
// 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
const accessToken = jwt.sign(
{ userId: user.userId },
ACCESS_TOKEN_SECRET_KEY,
{ expiresIn: "12h" },
);
console.log(accessToken); ---> 여기에서 token을 받아오지 못하고 "undefined"가 찍혔음
const refreshToken = jwt.sign(
{ userId: user.userId },
REFRESH_TOKEN_SECRET_KEY,
{ expiresIn: "7d" },
);