node.js 로그인 기능 구현하고
로그인 성공 후 리다이렉트로 홈으로 돌아가는 과정에서
넘어가지 않아요.
세션 저장된 것 확인 하였는데
홈 화면을 보여주지 않아요.
// 로그인 관련 코드 (복붙)
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false})); // 비밀코드 : 세션을 만들때 사용되는 비밀번호 (아무거나 작성)
app.use(passport.initialize());
app.use(passport.session());
app.get('/login',function(req,res){
res.render('login.ejs')
})
app.post('/login',passport.authenticate('local',{ // local 방식으로 인증 해줌
failureRedirect : '/fail' // 회원인증 실패하면 fail로 이동
}),function(req,res){
res.redirect('/') // 회원인증 성공시 리다이렉트
})
// LocalStrategy 인증방법
passport.use(new LocalStrategy({
usernameField: 'id', // 폼으로 부터 입력 받은 아이디, 비밀번호 (인풋 네임 id, pw)
passwordField: 'pw',
session: true, // 로그인후 세션을 저장할 것인지 true
passReqToCallback: false, //
}, function (입력한아이디, 입력한비번, done) { // 아이디 비번 말고도 다른 정보 검증시, 위의 false를 true로 변경
console.log(입력한아이디, 입력한비번);
db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
if (에러) return done(에러)
if (!결과) return done(null, false, { message: '존재하지않는 아이디요' }) // 아이디 비번 불일치시 done 2번째 파라미터 false
if (입력한비번 == 결과.pw) {
return done(null, 결과) // done : 라이브러리 문법임. 3개의 파라미터를 가질수 있음
//done(1.서버에러, 2.성공시 사용자 DB데이터,)
} else {
return done(null, false, { message: '비번틀렸어요' })
}
})
}));
// 세션 만들기 (라이브러리 이해 x) 로그인 성공시 발동
passport.serializeUser(function(user,done){ // user에는 검증에서 비밀번호까지 일치했을때 DB의 결과가 들어감.
done(null, user.id)
});
// 마이페이지 접속시 발동
passport.deserializeUser(function(아이디,done){
db.collection('login').findOne(({id : 아이디}),{function(err,result){
done(null,{result})
}})
});