인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이승연님의 프로필 이미지
이승연

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

passport serializeUser 질문 드립니다.

해결된 질문

작성

·

1.1K

1

강의 들으면서 프론트엔드도 직접 만들어가면서 실습 중인데요 로그인 부분에서 에러가 발생하는데 도무지 해결이 안되서 질문드립니다.

Error: Failed to serialize user into session [0] at pass (C:\Users\L-108\Desktop\web\react-node\node_modules\passport\lib\authenticator.js:281:19) [0] at Authenticator.serializeUser (C:\Users\L-108\Desktop\web\react-node\node_modules\passport\lib\authenticator.js:299:5) [0] at SessionManager.logIn (C:\Users\L-108\Desktop\web\react-node\node_modules\passport\lib\sessionmanager.js:14:8) [0] at IncomingMessage.req.login.req.logIn (C:\Users\L-108\Desktop\web\react-node\server\node_modules\passport\lib\http\request.js:50:33) [0] at C:\Users\L-108\Desktop\web\react-node\server\routes\auth.js:42:20 [0] at Strategy.strategy.success (C:\Users\L-108\Desktop\web\react-node\server\node_modules\passport\lib\middleware\authenticate.js:219:18) [0] at verified (C:\Users\L-108\Desktop\web\react-node\server\node_modules\passport-local\lib\strategy.js:83:10) [0] at Strategy._verify (C:\Users\L-108\Desktop\web\react-node\server\passport\localStrategy.js:17:21)

이런 에러가 발생합니다. serializeUser가 호출이 안되나 싶어서  console.log를 찍어가며 확인을 했는데 req.login 안에서 찍은 console.log는 문제없이 출력되고 serializeUser에서 찍은 console.log는 출력이 되지 않습니다. serializeUser가 호출이 제대로 안되고 있는건가요? 어떤 부분을 살펴봐야 할까요 답변 부탁드립니다.ㅠㅠ

//auth.js
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(`/?loginError=${info.message}`);
        }
        return req.login(user, (loginError) => {
            console.log("check");
            if(loginError){
                console.error(loginError);
                return next(loginError);
            }
            // 세션 쿠키를 브라우저로 보내준다.

            return res.redirect('/');
        });
    })(req, res, next);
});

//passport/index.js
const passport = require('passport');
const local = require('./localStrategy');
const kakao = require('./kakaoStrategy');
const User = require('../models/user');

module.exports = () =>{
    passport.serializeUser((user, done) => {
        console.log("1234");
        done(null, user.id);
    });

    passport.deserializeUser((id, done) =>{
        User.findOne({ where: { id }})
            .then(user => done((null, user.id)))
            .catch(err => done(err));
    })

    local();
    kakao();
};

주세요.

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

passport.initialize랑 passport.session 미들웨어 추가하셨나요?

이승연님의 프로필 이미지
이승연
질문자

넵 authRouter 이전에 추가해놨습니다.

//app.js
const express = require('express');
const cookieParser = require('cookie-parser');
const morgan = require('morgan');
const path = require('path');
const session = require('express-session');
const dotenv = require('dotenv');
const passport = require('passport');

dotenv.config();
const pageRouter = require('./server/routes/page');
const authRouter = require('./server/routes/auth');
const {sequelize} = require('./server/models');
const passportConfig = require('./server/passport');

const app = express();
app.set('port', process.env.PORT || 8002);
app.set('view engine', 'html');
sequelize.sync({force: false})
    .then(() => {
        console.log('데이터베이스 연결 성공');
    })
    .catch((err)=>{
        console.error(err);
    });
passportConfig();

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false,
    },
}));
app.use(passport.initialize());
app.use(passport.session());

// app.use('/', pageRouter);
app.use('/api/auth', authRouter);
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

localstrategy도 보여주세요

이승연님의 프로필 이미지
이승연
질문자

localStrategy입니다!

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, {loginSuccess:false, message: '비밀번호가 일치하지 않습니다.'});
                }
            } else {
                done(null, false, {loginSuccess:false, message: '가입되지 않은 회원입니다.'});
            }
        } catch (err){
            console.log(err);
            done(err);
        }
    }));
};

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

다른 건 다 문제 없고 serializeUser가 인식되고 있지 않는 것 같습니다. 폴더 구조가 제 강좌랑 다른 것 같은데 어떤 구조인건가요?

이승연님의 프로필 이미지
이승연
질문자

서버랑 클라이언트 폴더를 구분하느라 좀 변경했습니다.

app.js가 밖에 나와있고 나머지는 server폴더안에 그대로 위치시켰습니다. 프론트 서버에서 http-proxy-middleware 이용해서 서버로 요청을 보내고 있습니다. 회원가입까지는 잘 작동했는데 로그인 부분에서 막히네요ㅠㅠ....

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
    app.use(
        '/api',
        proxy({
            target:'http://localhost:8002',
            changeOrigin: true,
        })
    );
};

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

일단 passportConfig() 대신 passport.serializeUser, deserializeUser 부분을 app.js에 선언해보세요. 그래도 안 되면 exUser 객체를 json 형식으로 바꿔야할 것 같습니다.

이승연님의 프로필 이미지
이승연
질문자

답변 정말 감사합니다 해결 된 것 같습니다! (채ㅐ근데 passportConfig()를 지우니까 요청이 제대로 안들어가서 app.js에서 passportConfig 밑에 serializeUser와 deserializeUser를 그냥 같이 붙여줬더니 일단 되는 것 같습니다.  일단 되는거 같아서 기분은 좋은데 왜 이건 되고 원래는 안됬던건지는 여전히 모르겠네요... 

passportConfig();
passport.serializeUser((user, done) => {
    done(null, user.id);
});

passport.deserializeUser((id, done) =>{
    User.findOne({ where: { id }})
        .then(user => done((null, user.id)))
        .catch(err => done(err));
})
이승연님의 프로필 이미지
이승연

작성한 질문수

질문하기