auth.controller.js
const AuthService = require("../services/auth.service");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcrypt");
class AuthController {
authService = new AuthService();
// 회원가입(email 동일하면 안됨!)
signup = async (req, res, next) => {
try {
const { nickname, password, email, phoneNumber, admin } = req.body;
if (!nickname || !password || !email || !phoneNumber || !admin) {
return res.status(400).json({ message: "모든 값을 입력하세요!" });
}
const foundByEmail = await this.authService.findByEmail(email);
if (foundByEmail.length > 0) {
return res.status(409).json({ message: `${email} is already exists` });
}
const hashed = await bcrypt.hash(password, 12);
if (admin === "1") {
const point = 0;
const createUser = await this.authService.createUser(
nickname,
hashed,
email,
phoneNumber,
admin,
point
);
return res
.status(201)
.json({ data: createUser, message: "회원가입완료!" });
}
const createUser = await this.authService.createUser(
nickname,
hashed,
email,
phoneNumber,
admin
);
res.status(201).json({ data: createUser, message: "회원가입완료!" });
} catch (error) {
res.status(400).json({ errorMessage: error.message });
}
};
// 로그인
login = async (req, res) => {
try {
const { email, password } = req.body;
// console.log(req.body);
// console.log(email);
const user = await this.authService.findByEmail(email);
// console.log(user, 456465);
const passwordTest = await bcrypt.compare(password, user[0].password);
// console.log(passwordTest, 78978978);
if (user.length === 0 || !passwordTest) {
return res
.status(401)
.json({ message: "사용자가 없거나 비밀번호가 틀렸습니다!" });
}
const accessToken = jwt.sign(
{
userId: user[0].id,
userNickname: user[0].nickname,
admin: user[0].admin,
},
"my-secrect-key", //비밀키
{ expiresIn: "1d" }
);
// 쿠키에 토큰 담아서 보내기
// res.cookie("accessToken", accessToken, { httpOnly: true, secure: true });
res.cookie("accessToken", accessToken);
return res.status(200).json({ message: "로그인완료!" });
} catch (error) {
console.log(error);
return res.status(400).json({ message: "로그인실패!" });
}
};
//로그아웃
logout = async (req, res) => {
res.clearCookie("accessToken");
return res.json({ message: "logout success" });
// return res.redirect("/"); // 로그인 페이지로
};
}
module.exports = AuthController;
auth.js
const jwt = require("jsonwebtoken");
const { user } = require("../models");
module.exports = async (req, res, next) => {
const { cookie } = req.headers;
if (!cookie) {
return res.status(401).json({ message: "로그인 후 이용가능합니다." });
}
const [authType, authToken] = cookie.split("=");
if (!authToken || authType !== "accessToken") {
res.status(401).send({
message: "로그인 후 이용가능합니다.",
});
return;
}
try {
const { userId } = jwt.verify(
authToken,
"my-secrect-key" //secretkey
);
user.findByPk(userId).then((user) => {
res.locals.user = user;
next();
});
} catch (error) {
console.log(error);
// // 쿠키삭제
// res.clearCookie("accessToken");
return res.status(401).json({ message: "로그인 후 이용가능합니다!" });
}
};
=>
route(laundry.routes.js)에서 미들웨어 사용할 때
router.post(
"/apply",
upload.single("file"),
authMiddleware,
laundryController.createApply
);
router.get("/", authMiddleware, laundryController.getApplyById);
loginCheck.js
const jwt = require("jsonwebtoken");
const { user } = require("../models");
module.exports = async (req, res, next) => {
const { cookie } = req.headers;
if (!cookie) {
res.locals.user = false;
next();
return;
}
const [authType, authToken] = cookie.split("=");
if (!authToken || authType !== "accessToken") {
res.locals.user = false;
next();
return;
}
try {
const { userId } = jwt.verify(
authToken,
"my-secrect-key" //secretkey
);
user.findByPk(userId).then((user) => {
res.locals.user = user;
next();
});
} catch (error) {
console.log(error);
res.locals.user = false;
next();
}
};
=>
app.js에서 res.locals.user값에 따라 열리는 page 다르게 처리
// 마이 페이지
app.get('/user', loginMiddleware, (req, res) => {
if (res.locals.user) {
if (res.locals.user.admin === 0) {
return res.render('userMyPage.ejs', { admin: 0, list: -1 });
} else {
return res.render('userMyPage.ejs', { admin: 1, list: -1 });
}
} else {
return res.render('logIn.ejs');
}
});