본문 바로가기
매일코딩/Node.js

[node.js] passport 로그인& 간편 로그인

by 인생여희 2017. 5. 26.
반응형

passport 설정 --세션 모듈과 설정은 미리 해둬야 한다.


//0준비작업

//페스포트 사용

var passport = require('passport')

var LocalStrategy = require('passport-local').Strategy;




//페스포트 초기화 및 세션 사용

app.use(passport.initialize());

//페스포트 인증을 사용할때 세션을 사용하겠다.

//반드시 세션 모듈 뒤에 추가 //로그인 관련된 작업

app.use(passport.session());




//3.세션을 저장하는 부분 user 는 new LocalStrategy done() 으로 날린값


passport.serializeUser(function(user, done) {


    console.log("serializeUser=" + user)

    

//세션의 식별자를 username을 done으로 저장

//세션에 식별자 저장!

done(null, user.username); //세션에 "현재 웹브라우저로 접속한 식별자를 가지고 있는 쿠키는 이런 유저 아이디 이다" 라는 정보가 세션에 저장되어 있다.


});


//4. 세션에 식별자가 저장되어 있으면 이 콜백함수가 실행! 식별자 값을 id 로 저장

passport.deserializeUser(function(id, done) {


    console.log("deserializeUser=" + id);


    for (var i = 0; i < users.length; i++) { //사용자에 대한 정보가 db에 있는지 확인


        var user = users[i];


        if (user.username === id) {


            return done(null, user); // 식별자 값을 던진다. request 객체에 세션에 저장된 user 값을 확인할 수 있다. 이후 페이지에서  req.user로 확인할 수 있다.

        }


    }


});



//// 2로그인 로컬 전략 실행 (설정 부분) 

passport.use(new LocalStrategy(


    function(username, password, done) {   //인자를 3개 받는다. //사용자가 있으면 done으로 user 값을 넘긴다


        //기본적으로 nodsjs는 body 데이터를 전송 안해줌 

        //모듈 설치 !

        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); //사용자를 넘겨준다.

console.log("LocalStrategy="+user);

                    

}

                    else {


                        done(null, false) //로그인이 실패 했다.


                    }


                });


            }


        }


        done(null, false);

       

    }));



// 1 로그인 페이지의 데이터 전송 2번으로 이동

app.post('/auth/login',


    //로그인되면 여기서 받는다.

    // local 전략을 실행하겠다.

    passport.authenticate('local',


        {

            successRedirect: '/welcome', //성공했을 때

            failureRedirect: '/auth/login', //실패했을 때 

            failureFlash: false //true 라고 주면 done(,,,message:'') 세번째 인자에 메시지를 담을 수 있다. 메시지는 그다음  view 페이지에서 보여진다.


        })

);




//로그아웃은

req.logout();



//회원가입후 바로 로그인

// passport login 메서드 사용

req.login(user,function(err){

req.session.save(function(){ // 세션이 확실히 저장되고 나서 실행되는 콜백 함수

res.redirect('/welcome');

});

});





로직 순서

0.필요모듈과 미들웨어 설치

1. 폼에서 post 방식으로 아이디와 비번을 보내면 passport.authenticate 이 받는다.

2. local 인지 타사 인증 인지 확인후 관련 전략로직을 실행

3.passport.use(new LocalStrategy(function(username, password, done) { 실행

4.user가 존재하면 done으로 users 정보가 전달된다.

5.성공하면 successRedirect:~

6.실패하면 failureRedirect:~


7.passport.serializeUser 실행 user에 user 정보가 들어있다.

8. 이후에 passport.deserializeUser가 실행 된다.

9. deserializeUser가 done을 던지면

10.request 객체에 세션에 저장된 user 값을 확인할 수 있다. 이후 페이지에서  req.user로 확인할 수 있다.



반응형

댓글