GitHub - jaredhanson/passport: Simple, unobtrusive authentication for Node.js.
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'test',
cookie: {
httpOnly: true
},
}));
var passport = require('passport');
var LocalStrategy = require('passport-local');
app.use(passport.initialize());
app.use(passport.session());
// session middleware 밑에 선언한다.
// passport가 내부적으로 session을 사용하기 때문
// session 객체의 passport key에 user 식별자를 심어넣는 곳
passport.serializeUser(function(user, done) {
console.log('serializeUser',user);
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('deserializeUser',id);
done(null, authData);
});
passport.use(new LocalStrategy(
{
usernameField : 'id',
passwordField : 'pwd',
},
function (username, password, done) {
console.log('LocalStrategy',username, password);
if (username === authData.id) {
console.log(1);
if (password === authData.password) {
console.log(2);
return done(null, authData, {
message : 'welcome'
})
} else {
console.log(3);
return done(null, false, {
message : 'Incorrect password'
})
}
} else {
console.log(4);
return done(null, false, {
message : 'Incorrect username'
})
}
}
));
app.post('/auth/login_process', passport.authenticate('local', {
successRedirect : '/', // 성공시 이 루트로
failureRedirect : '/auth/login', // 실패시 이 루트로
failureFlash : true // 로그인 실패시 flash message 사용
}));
app.get('/auth/logout', (req, res) => {
try{
req.logout(function(err) {
if (err) { return next(err); }
req.session.save(() => {
res.redirect('/');
});
});
} catch(err) {
console.error(err);
}
})
passport.authenticate 미들웨어가 이를 받아서 ‘local’ strategy를 수행한다.
req.body의 key값은 유저가 custom할 수 있다.
이동하기 전, session 객체에 심어져있는 passport 객체에 req.user 객체가 심어진다.
후에 다른 라우터에서 로그인이 된 상태라면 req.user 객체에서 사용자 정보를 얻어낼 수 있다.