const LocalStrategy = require('passport-local').Strategy; // local을 사용하겠다.
module.exports = function (passport) {
passport.use(
"yourRouteFrom",
new LocalStrategy(
{
// override default fields in passport module
usernameField: "yourEamil",
passwordField: "yourPassword",
// pass in request from route to check if a user is logged in()
passReqToCallback: true,
},
async (req, email, password, done) => {
try {
const userOnDB = await User.findOne({ EMAIL: email });
const isSuccess = bcrypt.compareSync(password,userOnDB.PASSWORD); // True or False
//if the id and password matches
if (isSuccess) {
done(null, userOnDB);
} else {
return done(null, false);
}
} catch (error) {
console.log(error);
}
}
)
passport.serializeUser((user, done) => {
done(null, user.id);
});
//after verification, get request user info from Session.
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => done(err, user));
}); );
}
done으로 serializeUser에 정보를 넘겨서 Session에 저장을 한다.
serializeUser method에서는 function(user, done) 을 이용해서 session에 저장할 정보를 done(null, user)과 같이 두번째 인자로 넘기면 된다. LocalStrategy 객체의 인증함수에서 done(null, user)에 의해 리턴된 값이 넘어 온다. 이 예제에서는 이 user 객체 전체를 사용자 session에 저장한다.
그리고 node.js의 모든 페이지에 접근할때, 로그인이 되어 있을 경우 모든 사용자 페이지를 접근할 경우, deserilizeUser가 발생해서 deserializeUser에서는 session에 저장된 값을 이용해서 사용자 Profile을 찾은후 HTTP request의 리턴한다.
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => done(err, user));
}); );
}
callback 함수의 첫번째 인자로 넘어오는 내용 "user"는 세션에 저장된 사용자 정보.session에 해당 사용자의 정보를 저장했기에 별도의 변경 없이 done(null, user)를 이용해서 그대로 session에서 읽은 내용을 리턴한다.
Session에 사용자 정보를 저장하고자할 경우, 사용자 정보가 크다면 메모리가 많이 소모하기 때문에,serializeUser시에, 사용자 id와 같은 키 정보만 저장하고도록 하고, 페이지가 접근될때 마다 deserilizeUser가 수행되면, 세션에 저장된 사용자 id를 이용해서 DB에서 사용자 정보를 추가로 select해서 HTTP request에 붙여서 return 하는 형태를 사용한다.
serialize시에 session에서는 user.id인 사용자 id 값만 저장하고, deserialize시에는 session에 저장된 id를 이용해서, DB에 매번 사용자 정보를 select하는 모습을 볼 수 있다.