리셋 되지 말자

[NodeJS] session 정보 저장 문제 해결 본문

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);
});

Comments