Passport를 이용해 node.js 로그인 기능 구현 (mysql)

김예지·2021년 7월 26일
0
post-custom-banner

Passport를 이용해 "가장 기본적인" 로그인 기능 구현.

  • email, password를 사용해 로그인한다고 가정.
  • sequelize 사용
  1. app.js에 추가할 코드
const passport = require("passport");
const session = require("express-session");

app.use(
  session({ secret: "비밀코드", resave: true, saveUninitialized: false })
);
app.use(passport.initialize());
app.use(passport.session());
  1. user.js 라우터에 추가할 코드 (나의 경우 맨 밑에 추가함)

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;


router.post(
  "/login",
  passport.authenticate("local", { failureRedirect: "/fail" }),
  function (req, res) {
    res.redirect("/");
  }
);

passport.use(
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      session: true,
      passReqToCallback: false,
    },
    async function (email, password, done) {
      console.log(email, password);
      try {
        const result = await user.findOne({
          where: { email: email, password: password },
        });
        if (!result)
          return done(null, false, { message: "존재하지않는 아이디요" });
        if (email == result.password) {
          return done(null, result);
        } else {
          return done(null, false, { message: "비번틀렸어요" });
        }
      } catch (err) {
        return done(err);
      }
    }
  )
);

passport.serializeUser(function (user, done) {
  console.log("serializeUser ", user);
  done(null, user.user_id);
});

passport.deserializeUser(async function (id, done) {
  console.log("deserializeUser id ", id);
  var userinfo = await user.findOne({
    where: { user_id: id },
  });
  done(null, userinfo);
});

function checkLogin(req, res, next) {
  if (req.user) {
    console.log("login checked");
    next();
  } else {
    console.log("login first");
    res.send("로그인 안하셨는데요?");
  }
}
  1. 만약에 로그인한사람한테만 보이는 페이지를 넣고 싶다면? Middleware 추가
router.put("/user/:user_id", checkLogin, async (req, res) => {
  const { user_id } = req.params;
  const { email, password, nickname } = req.body;
  try {
    await user.update(
      {
        email,
        password,
        nickname,
      },
      {
        where: { user_id },
      }
    );
    res.status(200).send({
      ok: true,
    });
  } catch (err) {
    console.error(err);
    res.status(400).send({
      ok: false,
      message: `${err}`,
    });
  }
});
profile
새싹
post-custom-banner

0개의 댓글