Programming/Node.js
Node.js : DB 연동 - Passport 로그인 처리
파란크리스마스
2019. 3. 10. 03:49
728x90
출처
- NodeJS Passport login script with MySQL database
- node.js 사용자에게 메시지 날리기 connect-flash : 네이버 블로그
- 15장 passport 모듈을 이용한 사용자 인증 (2) :: GoodBye World
/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());