로컬 로그인 구현하기 (2)
회원가입, 로그인, 로그아웃 라우터를 작성합니다.
routes/auth.js
const express = require("express");
const passport = require("passport");
const bcrypt = require("bcrypt");
const { isLoggedIn, isNotLoggedIn } = require("./middlewares");
const User = require("../models/user");
const router = express.Router();
router.post("/join", isNotLoggedIn, async (req, res, next) => {
const { email, nick, password } = req.body;
try {
const exUser = await User.findOne({ where: { email } });
if (exUser) {
return res.redirect("/join?error=exist");
}
const hash = await bcrypt.hash(password, 12);
await User.create({
email,
nick,
password: hash,
});
return res.redirect("/");
} catch (error) {
console.error(error);
return next(error);
}
});
router.post("/login", isNotLoggedIn, (req, res, next) => {
passport.authenticate("local", (authError, user, info) => {
if (authError) {
console.error(authError);
return next(authError);
}
if (!user) {
return res.redirect(`/?loginmError=${info.message}`);
}
return req.login(user, (loginError) => {
if (loginError) {
console.log(loginError);
return next(loginError);
}
return res.redirect("/");
});
})(req, res, next); // 미들웨어 내의 미들웨어는 (req, res, next)을 붙입니다.
});
router.get("/logout", isLoggedIn, (req, res) => {
req.logout();
req.session.destroy();
res.redirect("/");
});
module.exports = router;
나중에 app.js와 연결할 때 /auth 접두사를 붙일 것이므로 라우터의 주소는 각각 /auth/join, /auth/login, /auth/logout이 됩니다.
passport/localStrategy.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const User = require('../models/user');
module.exports = () => {
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
}, async (email, password, done) => {
try {
const exUser = await User.findOne({ where: { email } });
if (exUser) {
const result = await bcrypt.compare(password, exUser.password);
if (result) {
done(null, exUser);
} else {
done(null, false, { message: '비밀번호가 일치하지 않습니다.' });
}
} else {
done(null, false, { message: '가입되지 않은 회원입니다.' });
}
} catch (error) {
console.error(error);
done(error);
}
}));
};
로그인 전략을 구현했습니다. passport-local 모듈에서 Strategy 생성자를 불러와 그 안에 전략을 구현하면 됩니다.
먼저 사용자 데이터베이스에서 일치하는 이메일이 있는지 찾은 후, 있다면 bcrypt의 compare 함수로 비밀번호를 비교합니다. 비밀번호까지 일치한다면 done 함수의 두 번째 인수를 사용하는 경우는 서버 쪽에서 에러가 발생 했을 떼고, 세 번째 인수를 사용하는 경우는 로그인 처리 과정에서 비밀번호가 일치하지 않거나 존재하지 않는 회원일 때와 같은 사용자 정의 에러가 발생했을 때입니다.
done이 호출된 후에는 다시 passport.authenticate의 콜백 함수에서 나머지 로직이 실행됩니다. 로그인에 성공했다면 메인 페이지로 리다이렉트되면서 로그인 폼 대신 회원 정보가 뜰 것입니다. 아직 auth 라우터를 연결하지 않았으므로 코드가 동작하지 않습니다.
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| 카카오 로그인 구현하기 (2) (0) | 2025.11.01 |
|---|---|
| 카카오 로그인 구현하기 (1) (0) | 2025.10.29 |
| 로컬 로그인 구현하기(1) (0) | 2025.10.23 |
| Passport 모듈로 로그인 구현하기 (0) | 2025.10.20 |
| 데이터베이스 세팅하기 (3) (0) | 2025.10.17 |