passport serializeUser 질문 드립니다.
강의 들으면서 프론트엔드도 직접 만들어가면서 실습 중인데요 로그인 부분에서 에러가 발생하는데 도무지 해결이 안되서 질문드립니다.
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 미들웨어 추가하셨나요?
0
넵 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);
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);
}
}));
};
0
서버랑 클라이언트 폴더를 구분하느라 좀 변경했습니다.
app.js가 밖에 나와있고 나머지는 server폴더안에 그대로 위치시켰습니다. 프론트 서버에서 http-proxy-middleware 이용해서 서버로 요청을 보내고 있습니다. 회원가입까지는 잘 작동했는데 로그인 부분에서 막히네요ㅠㅠ....
const proxy = require('http-proxy-middleware');
0
일단 passportConfig() 대신 passport.serializeUser, deserializeUser 부분을 app.js에 선언해보세요. 그래도 안 되면 exUser 객체를 json 형식으로 바꿔야할 것 같습니다.
0
답변 정말 감사합니다 해결 된 것 같습니다! (채ㅐ근데 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));
})
리눅스 노드 설치시 패키지
0
172
0
socket.js 에서 referer로부터 roomId를 가져올 때
0
926
3
스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문
0
2297
2
a[title] 질문드립니다
0
386
1
리뉴얼 강의 및 공부 방법
0
589
1
jwt decode
0
1138
1
node.js 교과서 3판 질문드립니다
0
396
1
passport와 jwt
0
438
1
리뉴얼 강의
0
428
2
혹시 Node.js 교과서 3판 이북은 언제 나오나요?
0
359
1
몽고디비 사용자도 MYSQL부분을 들어야 하나요???
0
489
1
sql 쿼리 로그는 어떤 모듈이 작성하나요?
0
511
2
nunjucks res.render('error'); 작동을 안합니다.
0
518
1
질문있습니다.
0
348
1
multer 한글 파일 업로드시 파일명이 깨져요.
1
3543
1
수업자료는 어디있나요?
0
374
1
질문 있습니디
0
245
1
multer 사용시 file 외 name값은 못받나용?
0
430
1
코드 중복 부분 질문드립니다.
0
303
1
api 만드는 이유 질문드립니다.
0
293
1
Strategy의 done에 대해 질문드립니다.
0
374
1
안녕하세요 fs 권한 관련 질문드립니다
0
456
1
시퀄라이즈 연결질문...
0
510
2
res.setHeader vs res.cookie
0
1797
3





