로그인을 하는 과정을 진행한다.

로그인을 진행하면서, passport 를 사용하게 된다.

passport.use(new LocalStrategy(
  function(username, password, done){
    var uname = username;
    var pwd = password;
    // 인증하는 부분을 변경할 것이다.
    // users 테이블에 있는 값들 중에서 authId 를 체크하면 된다.
    var sql = "SELECT * FROM users WHERE authId=?"
    conn.query(sql,['local:'+uname],function(err,results){
      // 값이 잘 들어오는 것을 확인했다.
      //console.log(results)
      if(err){
        return done('There is no user.');
      }
      // results 배열의 첫 번째 값을 user에 담는다.
      var user = results[0];
      // 사용자가 입력한 패스워드 값 -> pwd , user.salt -> 저장해놓은 데이터 배열의 salt 값
      return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash){
        // hash -> 입력한 값을 해싱 처리한 값, user.password -> 저장되어 있는 패스워드 값
         if(hash === user.password){
           // 정상적인 사용자
           console.log('LocalStrategy', user);
           // done 의  두 번째 인자로 user가 들어간다.
           done(null, user);
         } else {
           done(null, false);
         }
       });
    });
  }
));

만약 로그인이 정상적으로 진행된다면, done 을 해서 user 값을 serializeUser 로 전달하고,

로그인이 실패했다면, donefalse 를 넣어서 로그인에 실패했다는 것을 알린다.

passport.serializeUser(function(user, done) {
  console.log('serializeUser', user);
  // authId 값을 추출한다.
  done(null, user.authId);
});
// 이후에 또 로그인을 하게되면, deserializeUser로 코드가 진행된다.
// id 값에는 local: 이 포함되어있다.
passport.deserializeUser(function(id, done) {
  console.log('deserializeUser', id);
  var sql = "SELECT * FROM users WHERE authId=?";
  conn.query(sql,[id],function(err,results){
    if(err){
      console.log(err);
      done('There is no user.');
    }else{
      done(null, results[0]);
    }
  });
});

serializeUser 를 통해서, user 배열에 authId 값을 뽑아내서 deserializeUser 함수에 id 값으로 보낸다.