[Node.js] 패스포트(Passport)

Posted by 신희준 on November 12, 2017



2017 - 11 - 12 (일)


  • Passport 개요


  • 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);
        });
      }
    ))