2017 - 11 - 12 (일)
PASSPORT 개요
패스포트는 노드에서 사용할 수 있는 사용자 인증 모듈이다.
패스포트를 활용하면 간단한 설정으로 로그인 기능을 구현할 수 있다.
패스포트는 여러가지 인증방식을 제공하는데 어떠한 인증방식을 사용할지 결정하는 것을 스트래티지 라고한다.
이 패스포트 기능을 활용하여 페이스북이나 구글의 계정을 사용해서 인증하도록 만들 수 도 있다.
- 패스포트 기본사용법
router.route('/login').post(passport.authentication('local',{
successRedirect : '/',
failureRedirect : '/login'
}
));
/*보통 client 에서 로그인 버튼을 딱 눌렀을 때('/login' 으로 submit 했을 때) router 미들웨어는 이 요청을 다음과같은 형식으로 passport 를 활용하여 처리한다.(기본적으로)
successRedirect 는 로그인이 인증이 확인된다면 index.html로 보내고
failureRedirect 의 경우 /login 으로 (다시 로그인화면으로) 보낸다.
*/
- 필요 패키지
$ npm install passport --save
- 스트래티지 지정
router.route('/login').post(passport.authentication('local'),function(req, res){
// 인증에 성공할 경우 호출
// 'req.user' 는 인증된 사용자의 정보이다
res.redirect('/users/'+req.user.username);
});
//'local' 은 스트래티지의 이름이다. 특정 스트래티지를 위와 같이 지정한다.
- 플래시 메시지 / 커스텀 콜백
우선 필요패키지를 인스톨 해줍니다.
$ npm install connect-flash --svae
redirect 시 플래시 메시지를 사용한다. ( 이 부분은 스프링의 addFalshAttribute와 비슷한거 같다. )
//플래쉬 메시지 설정 ( 파라미터 2개일경우 )
req.flash('loginMessage','등록된 계정이 없다.');
//플래쉬 메시지 확인 ( 파라미터 1개일경우)
req.flash('loginMessage')
passport.authentication 시 옵션을 줄 수도 있다.
router.route('/login').post(passport.authenticate('local',{
successRedirect : '/',
failureRedirect : '/login',
failureFlash:true
// 패스포트로 인증하는 과정에서 오류 발생시 플래시 메시지가 오류로 전달된다.
}
));
passport.authenticate('local',{failureFlash: '아이디랑 비밀번호를 확인해주세요'
}
));
- 커스텀 콜백
router.route('/login').get(function(req,res,next){
passport.authenticate('local',function(err,user,info){
if(err){return next(err);}
if(!user){return res.redirect('/login');}
req.login(user, function(err){
if(err){return next(err);}
return res.redirect('/users/'+user.username);
});
})(req,res,next);
})
- 로컬 인증 방식
$ npm install passport-local --save
로컬 인증 방식을 위해 passport-local 모듈을 설치한다.
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
passport.user(new LocalStrategy(
function(username, password , done){
UserModel.findOne({username : username}, function(err, user){
if(err){return done(err);}
if(!user){
return done(null, false, { message : '아이디가 틀립니다.'});
}
if(!user.validPassword(password)){
return done(null, false, { message : '비밀번호가 틀립니다.'})
}
return done(null, user);
});
}
))