PassportJS

Federation Authentification

Nodejs로 웹 어플리케이션을 개발할 때 인증을 도와주는 'PassportJS' 모듈이 있다.

Federation Authentification : 타사 인증. 페이스북/트위터/다음/카카오 등으로 로그인 하는 방법이다.

passport-facebook, passport-twitter 등이 존재하지만 passport-local은 자체적으로 인증하는 모듈이다. It needs middleware which returns call back function. post방식으로 로그인 데이터를 전송하면 passport의 authenticate 미들웨어가 받는다. 이 미들웨어는 콜백함수를 만들어주는 역할을 한다. 'local'에 의해 passport.use() passport에 등록된 LocalStrategy 객체의 인자인 콜백함수가 실행되고 이 콜백함수가 실행될 때는 로그인하는 username과 password가 첫번째, 두번째 인자로 전달된다.

app.post('/auth/login', 
        passport.authenticate(
            'local',//'local'이라는 strategy가 실행되면 위의 passport.use의 콜백함수가 실행된다!
        { successRedirect: '/welcome', 
        failureRedirect: '/auth/login', 
        failureFlash: false}))

코드 설명 : 로그인에 성공하면 'welcome'페이지로 리다이렉트하고, 실패하면 다시 로그인하도록 '/auth/login'으로 리다이렉트한다. 'failureFlash'는 로그인 성공/실패 여부에 따라 메시지를 출력하는 것에 관한 것이다.

passport.use(new LocalStrategy(//'LocalStretegy'객체를 생성하여 우리가 이전 코드에서 콜백함수로 작성했던 부분을 여기서 수행하는 듯.
    function(username, password, done) {//MongoDB의 API를 쓰고 있는 듯.
        var uname = username;
        var pwd = password;
        for(var i=0;i<users.length;i++) {
            var user = users[i];
            if(uname === user.username) {
                return hasher({password:pwd, salt:user.salt},function(err,pass,salt,hash){
                if(hash === user.password) {
                    done(null,user);//첫번째 인자인 null은 에러가 발생하면 그 에러.
                } else {
                    done(null,false);//로그인 절차가 끝났지만 로그인에 실패했다는 뜻.
                }
                });
            }
        }
        //user들을 찾는 for문이 끝났는데도 못찾으면 아래를 실행.
        done(null,false);
    }
  ));

코드 설명 : passport.use()로 passport가 실행되면 'LocalStrategy'라는 객체가 만들어지고, 로그인을 인증하는 콜백함수가 구현되어 있다. done함수의 첫번째 인자는 에러가 발생하면 그 에러를 의미한다. 로그인에 성공하면 두번째 인자로 false가 아닌 값, user를 전달하고, 로그인에 실패하면 두번째 인자로 false를 전달한다.

serializeUser로 세션에 사용자 정보가 저장되기 때문에 재접속할 때마다 deserializeUser만 실행된다.

세션을 다루지 않고 passport모듈을 이용하여 다루는 것이 바람직하다.

passport객체는 원래 express가 갖고 있지 않은 객체(user객체)를 req객체에 심는다.

Last updated