Node ch.16 _ passport기반 세션처리

세션을 확인해서 필요한 인증처리를 할 수 있다. (사용자 입력 받아 DB에 insert하기)

  1. 사용자로부터 입력받은 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;
    
    
  2. 여기까지의 실행화면

    새로운 email과 password입력

  3. 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;
    
    
  4. /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>
    
    
  5. 결과 확인

    하면..새로운 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 ......