NodeJS
[NodeJS] session 정보 저장 문제 해결
kyeongjun-dev
2020. 9. 30. 03:44
문제 인식
(github.com/jaredhanson/passport/issues/306)
req.login 함수가 async 즉 비동기라는 것이다. 이를 이용하여 /auth/login_process를 수정한다.
문제 해결
- deserializeUser 수정
passport.deserializeUser(function (id, done) {
console.log('deserialize', id);
const authData = {
email:'rudwns273@naver.com',
password:'12345',
nickname:'rudwns'
}
done(null, authData);
});
deserializeUser는 사용자가 로그인을 한 후에, 페이지에 접속할 때마다 실행되는 함수이다. authData를 전역으로 선언해줬어야하는데 임시방편으로 passport.use(new LocalStrategy)에서 선언한 authData를 똑같이 안에 선언해 주었다.
- /auth/login_process 수정
app.post('/auth/login_process',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/auth/login' }
));
app.post('/auth/login_process', passport.authenticate('local'), function (req, res) {
req.session.save(function () {
console.log('session save....');
res.redirect('/');
})
});
위가 수정 전이고, 아래가 수정 후이다. session에 정보를 저장한 후에 '/'페이지로 redirect 하도록 하였다.
- 결과
접속을 하면 먼저 req.user가 undefined로 출력이 되는걸 확인할 수 있다.
로그인 페이지로 이동한 뒤에 로그인을 위해 입력한 정보가 출력이 된 후에로그인을 하면, serialize 함수가 실행되고, email을 session에 저장한다. 그리고 redierect로 '/'로 이동하면, req.user가 생성되어 main {email, password, nickname}이 출력되는 것을 확인할 수있고, 페이지에 접속할 때마다 deserialize 함수가 실행되는 것을 확인할 수 있다.
하지만 이 코드로는 로그인에 실패 했을 때의 예외 처리를 할 수 없다. 이를 위해 코드를 수정한다.
로그인 실패 시 예외 처리
app.post('/auth/login_process', passport.authenticate('local',
{failureRedirect: '/auth/login'}),
function(req, res){
req.session.save(function(){
console.log('session save...');
res.redirect('/');
})
})
실패했을 시에 다시 login 페이지로, 성공했을 때는 '/'로 redirect 되도록 수정하였다.
- 공식 문서의 custom callback
app.post('/auth/login_process', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/auth/login'); }
req.logIn(user, function (err) {
if (err) { return next(err); }
req.session.save(function () {
res.redirect('/');
});
});
})(req, res, next);
});