Node.js: 패스포트 기반 로그인 환경 구성

Dahea Moon·2020년 3월 14일
0

passport 환경 구축

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')
})

MIDDLEWARE, STRATEGY 설정

// 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에서 확인
}))

passport 기반 router 설정

// router/join/index.js
router.post('/', passport.authenticate('loca-join'), {
    successRedirect: '/main',
    failureRedirect: '/join',
    failureFlash: true,
})

local-strategy callback && session 처리

// 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})
});

Log In logic

// 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);
});

Log Out 처리

// 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
위의 무료 강의를 보고 정리한 내용입니다.

profile
나를 위한 기록장

0개의 댓글