노드숙련강의 4-5

·2022년 12월 21일
0

study

목록 보기
22/81
post-thumbnail

로그인/회원가입 기능을 Sequelize로 구현하기(2)

사용자 모델을 이용해 회원가입 기능 수정하기

  1. MongoDB가 아닌 MySQL에 사용자 데이터를 저장하도록
  2. 이메일과 닉네임 중복 확인하는 코드도 제대로 동작하는지 확인
  3. 사용자 모델 불러오기 예시
const { User } = require("./models");

=> 원래는 "./models/user.js" 였음.

회원가입 API 수정 예시

// app.js
const { Op } = require("sequelize");
const { User } = require("./models");

router.post("/users", async (req, res) => {
  const { email, nickname, password, confirmPassword } = req.body;

  if (password !== confirmPassword) {
    res.status(400).send({
      errorMessage: "패스워드가 패스워드 확인란과 다릅니다.",
    });
    return;
  }

  // email or nickname이 동일한게 이미 있는지 확인하기 위해 가져온다.
  const existsUsers = await User.findAll({
    where: {
      [Op.or]: [{ email }, { nickname }],
    },
  });
  if (existsUsers.length) {
    res.status(400).send({
      errorMessage: "이메일 또는 닉네임이 이미 사용중입니다.",
    });
    return;
  }

  await User.create({ email, nickname, password });
  res.status(201).send({});
});

사용자 모델을 이용해 로그인 기능 수정하기

사용자 정보를 데이터베이스에서 가져오는 부분만 수정

로그인 API 수정 예시

// app.js

router.post("/auth", async (req, res) => {
  const { email, password } = req.body;

  const user = await User.findOne({
    where: {
      email,
    },
  });

  // NOTE: 인증 메세지는 자세히 설명하지 않는것을 원칙으로 한다: https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#authentication-responses
  if (!user || password !== user.password) {
    res.status(400).send({
      errorMessage: "이메일 또는 패스워드가 틀렸습니다.",
    });
    return;
  }

  res.send({
    token: jwt.sign({ userId: user.userId }, "customized-secret-key"),
  });
});

사용자 모델을 이용해 로그인 확인 미들웨어 수정하기

userId를 가지고 데이터베이스에서 사용자 정보를 불러오도록 해야겠죠?
공식 문서를 참고해보니 findByPk를 사용하면 적당해보이네요!

로그인 확인 미들웨어 수정 예시

// middlewares/auth-middleware.js

const jwt = require("jsonwebtoken");
const { User } = require("../models");

module.exports = (req, res, next) => {
  const { authorization } = req.headers;
  const [authType, authToken] = (authorization || "").split(" ");

  if (!authToken || authType !== "Bearer") {
    res.status(401).send({
      errorMessage: "로그인 후 이용 가능한 기능입니다.",
    });
    return;
  }

  try {
    //복호화 및 검증(findByPk사용)
    const { userId } = jwt.verify(authToken, "customized-secret-key");
    User.findByPk(userId).then((user) => {
      res.locals.user = user;
      next();
    });
  } catch (err) {
    res.status(401).send({
      errorMessage: "로그인 후 이용 가능한 기능입니다.",
    });
  }
};

QUIZ

mongoose 코드도 전부 제거

profile
개발자 꿈나무

0개의 댓글