Node.js : DB 연동 - Passport 로그인 처리

Programming/Node.js 2019.03.10 03:49 Posted by 파란크리스마스

출처

/config/dbHelper.js

const mariadb = require('mariadb');
var config = require('./db_config');    // ./는 현재 디렉토리를 나타냅니다

const pool = mariadb.createPool({
    host: config.host,
    port: config.port,
    user: config.user,
    password: config.password,
    database: config.database,
    connectionLimit: 5
});

function dbHelper() {
    //
    this.getConnection = function(callback) {
        pool.getConnection()
            .then(conn => {
                callback(conn);
            }).catch(err => {
            //not connected
        });
    };

    //
    this.getConnectionAsync = async function() {
        try {
            let conn = await pool.getConnection();
            // console.log("conn = " + conn); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
            return conn;
        } catch (err) {
            throw err;
        }
        return null;
    };

    //
    this.sendJSON = function(response, httpCode, body) {
        var result = JSON.stringify(body);
        response.send(httpCode, result);
    };
}

module.exports = new dbHelper();

/config/passport.js

var dbHelper = require('./dbHelper');
const LocalStrategy = require('passport-local').Strategy;

module.exports = (passport) => {

    // 로그인이 성공하면, serializeUser 메서드를 이용하여 사용자 정보를 Session에 저장할 수 있다.
    passport.serializeUser((user, done) => {
        console.log('serialize');
        done(null, user);
    });

    // 인증 후, 페이지 접근시 마다 사용자 정보를 Session에서 읽어옴.
    passport.deserializeUser((user, done) => {
        console.log('deserialize');
        done(null, user);
    });

    passport.use(new LocalStrategy({
            usernameField : 'userid',
            passwordField : 'password',
            passReqToCallback : true
        },

        // 인증 요청
        function(req, userid, password, done) {
            if(!userid || !password ) { return done(null, false, req.flash('message','All fields are required.')); }
            dbHelper.getConnection(function(conn) {
                console.log('conn = ' + conn);
                conn.query("select * from member where email = ?", [userid]).then((rows) => {
                    // console.log(rows);
                    if(!rows.length) {
                        return done(null, false, req.flash('message','Invalid username or password.'));
                    }
                    var dbPassword  = rows[0].password;
                    if(!(dbPassword == password)) {
                        return done(null, false, req.flash('message','Invalid username or password.'));
                    }
                    return done(null, rows[0]);
                })
                .then((res) => {
                    console.log('res = '+res); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
                    conn.end();
                })
                .catch(err => {
                    //handle error
                    console.log(err);
                    conn.end();
                    if (err) return done(req.flash('message',err));
                });
            });
        }
    ));
};

웹페이지에 값 전달 (connect-flash 모듈)

/app.js

var flash = require('connect-flash');

app.use(passport.session()); //로그인 세션 유지
app.use(flash());