session에 저장하여 로그인 상태 유지하기
passport: 인증관련 모듈 처리
passport-local: 로컬 db에 저장되는 로그인 인증 처리
express-session: 세션관리 처리
passport documentation 보면 더 자세히 나와있음
github passport-local 참고
npm install passport passport-local express-session connect-flash --save-dev
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const session = require('express-session')
const flash = require('connect-flash')
router.get('/', function(req, res){
res.render('join.ejs')
})
// app.js
app.use(session({
secret: 'any string',
resave: false,
saveUninitialized: true,
}))
app.use(passport.initialized())
app.use(passport.session())
app.use(flash())
callback에서 하는 일이 많음
// router/join/index.js
passport.use('local-join', new LocalStrategy({
usernamefield: 'email',
passwordfield: 'password',
passReqToCallback: true,
}, function(req, email, pawwrod, done) {
// db에서 확인
}))
// router/join/index.js
router.post('/', passport.authenticate('loca-join'), {
successRedirect: '/main',
failureRedirect: '/join',
failureFlash: true,
})
// router/join/index.js
router.get('/', function(req, res) {
let msg;
const errMsg = req.falsh('error')
if (errMsg) msg = errMsg;
res.render('join.ejs', {'message': msg});
})
// session 처리
// session에 저장
passport.serializeUser(function(user, done) {
console.log('passport session save: ', user.id)
done(null, user.id);
});
// session에서 뽑아서 전달
passport.deserializeUser(function(id, done) {
console.log('passport session get id: ', id)
done(null, id);
})
passport.use('local-join', new LocalStrategy({
usernamefield: 'email',
passwordfield: 'password',
passReqToCallback: true,
}, function(req, email, password, done) {
const query = connection.query('select * from user where email=?', {email}, function(err, rows){
if (err) return done(err);
if (rows.length) {
console.log('existed user')
return done(null, false, {message: 'your email is already used'})
} else {
const sql = {email: email, pw: password};
const query = connection.query('insert into user set?', sql, function(err, rows) {
if (err) throw err
// session에 넣을 data
return done(null, {'email': email, 'id': rows.insertId})
})
}
})
}))
// main.js
router.get('/', function(req, res) {
console.log('main js loaded', req.user)
const id = req.user;
res.render('main.ejs', {'id': id})
});
// router/login/index.js
// session 처리
// session에 저장
passport.serializeUser(function(user, done) {
console.log('passport session save: ', user.id)
done(null, user.id);
});
// session에서 뽑아서 전달
passport.deserializeUser(function(id, done) {
console.log('passport session get id: ', id)
done(null, id);
})
passport.use('local-login', new LocalStrategy({
usernamefield: 'email',
passwordfield: 'password',
passReqToCallback: true,
}, function(req, email, password, done) {
const query = connection.query('select * from user where email=?', {email}, function(err, rows){
if (err) return done(err);
if (rows.length) {
return done(null, {'email': email, 'id': rows[0].UID})
} else {
return done(null, false, {'message': 'your email is not found'})
}
})
}));
router.post('/', function(req, res, next){
passport.authenticated('local-login', function(err, user, info){
if (err) res.status(500).json(err);
if (!user) {return res.status(401).json(info.message)}
req.login(user,, function(err) {
if (err) return net(err);
return res.json(user);
});
})(req, res, next);
});
// router/logout/index.js
router.get('/logout', function(req, res){
req.logout();
res.redirect('/');
})
출처: https://www.inflearn.com/course/node-js-%EC%9B%B9%EA%B0%9C%EB%B0%9C
위의 무료 강의를 보고 정리한 내용입니다.