로그인을 하는 과정을 진행한다.
로그인을 진행하면서, 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);
}
});
});
}
));
pwd
) 과 데이터에 저장되어있는 salt
값을 이용해서 해싱을 진행한다.done(null,user)
done(null,false)
만약 로그인이 정상적으로 진행된다면, done
을 해서 user
값을 serializeUser
로 전달하고,
로그인이 실패했다면, done
에false
를 넣어서 로그인에 실패했다는 것을 알린다.
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
값으로 보낸다.