Node ch.16 _ passport기반 세션처리
세션을 확인해서 필요한 인증처리를 할 수 있다. (사용자 입력 받아 DB에 insert하기)
-
사용자로부터 입력받은 email, password를 DB에 입력하려면 세션값을 사용해야하는데
이때, done() 함수를 활용한 세션값의 처리는 passport.serialize 를 이용한다.
/join/index.js
var express = require('express') var app = express() var router = express.Router() var path = require('path') var mysql = require('mysql') var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; // DATABASE SETTING (Google Cloud SQL) var connection = mysql.createConnection({ host : '35.184.164.59', port : 3306, user : 'root', password : 'root', database : 'jsman' }); connection.connect(); router.get('/', function(req,res){ var msg; var errMsg = req.flash('error'); if(errMsg) msg = errMsg; res.render('join.ejs', {'message' : msg}); }) //passport.serialize passport.serializeUser(function (user, done) { console.log('passport session save : ', user.id) done(null, user.id); }); passport.deserializeUser(function (id, done) { console.log('passport session get id: ', id) done(null, id); }); //세션값을 뽑아서 db에 전달 passport.use('local-join', new LocalStrategy({ usernameField: 'email', //default 속성값 passwordField: 'password', //default 속성값 passReqToCallback: true }, function (req, email, password, done) { var 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 { var sql = {email: email, password:password}; var query = connection.query('insert into user set ?', sql, function(err,rows) { if(err) throw err return done(null, {'email' : email, 'id' : rows.insertId}); }) } }) } )); router.post('/', passport.authenticate('local-join', { successRedirect: '/main', failureRedirect: '/join', failureFlash: true }) ) module.exports = router;
-
여기까지의 실행화면
새로운 email과 password입력
-
main 페이지에서 결과 확인할 수 있도록 추가
/main/main.js 수정
var express = require('express') var app = express() var router = express.Router() var path = require('path') router.get('/', function(req,res){ console.log('main.js loaded', req.user) var id = req.user; //res.sendFile(path.join(__dirname + "/../public/main.html")) res.render('main.ejs', {'id' : id}); }); module.exports = router;
-
/views/main.ejs 추가
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>main</title> </head> <body> <h1>main page </h1> <h3>Welcome, <%=id %> !</h3> <script src="main.js"> </script> </body> </html>
-
결과 확인
하면..새로운 email입력하고 제출 누르면 mian 페이지로 이동해야 하는데 나는 이런 오류남 ㅠ
Error: Failed to deserialize user out of session at pass (/Users/csa/workspace/node-passport/node_modules/passport/lib/authenticator.js:344:19) at deserialized (/Users/csa/workspace/node-passport/node_modules/passport/lib/authenticator.js:349:7) at /Users/csa/workspace/node-passport/router/join/index.js:37:5 at pass (/Users/csa/workspace/node-passport/node_modules/passport/lib/authenticator.js:357:9) at Authenticator.deserializeUser ......