해결된 질문
작성
·
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
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);
}
}));
};
서버랑 클라이언트 폴더를 구분하느라 좀 변경했습니다.
app.js가 밖에 나와있고 나머지는 server폴더안에 그대로 위치시켰습니다. 프론트 서버에서 http-proxy-middleware 이용해서 서버로 요청을 보내고 있습니다. 회원가입까지는 잘 작동했는데 로그인 부분에서 막히네요ㅠㅠ....
const proxy = require('http-proxy-middleware');
일단 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));
})
넵 authRouter 이전에 추가해놨습니다.