내배캠 53일차

·2023년 1월 6일
0

내일배움캠프

목록 보기
56/142
post-thumbnail

로그인, 로그아웃, 회원가입, 미들웨어 구현

controller

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');
  }
});
profile
개발자 꿈나무

0개의 댓글