본문 바로가기
IT/web

Node.js] 사용자 인증 // 패스포트 모듈

by 깻잎쌈 2020. 2. 7.
반응형

use() 함수로스트래티지 (인증방식 ) 설정 후 -> 라우팅 함수에서 사용

인증방식은 로컬 인증, 다른 계정 사용하는 OAuth 인증 등 ㅈ나 많다.

 

 

Documentation

Overview Passport is authentication middleware for Node. It is designed to serve a singular purpose: authenticate requests. When writing modules, encapsulation is a virtue, so Passport delegates all other functionality to the application. This separation o

www.passportjs.org

 

var passport = require('passport'),
    flash = require('connect-flash');
    
  ..
//패스포트 초기화  
app.use(passport.initialize());
// 로그인 세션 유지 
app.use(passport.session());
// 플래쉬 메세지
app.use(flash());

로컬 Strategy 설정 

==> 인증 방식 결정됨.

 

passport-local

Local username and password authentication strategy for Passport.

www.passportjs.org

email을 아이디로 설정.

// 패스포트 로그인 설정 
passport.use('local-login', new localStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true
    
}, function(req,email, password, done){
     console.log('패스포트의 local-login 호출됨 '+ email);
    
    var database = app.get('database');
    database.userModel.findOne({'email':email}, function(err,user){ //검증 콜백 
        if(err){return done(err)};
        
        //등록된 사용자 없는 경우 
        if(!user){
            console.log('계정이 일치하지 않음 ');
            return done(null, false, req.flash('loginMsg', '등록된 계정이 없습니다 '))
        }
        
        //비밀번호가 일치하지 않는 경우 
        var authenticated = user.authenticate(password, user._doc.salt, user._doc.hashed_password);
        if(!authenticated){
            console.log('비번 일치x');
            return done(null, false, req.flash('loginMsg', '비번이 일치하지 않습니다'));
        }
        
        //정상인 경우
        console.log('계정과 비번이 일치함');
        return done(null, user);
    });
    
}));
// 패스포트 회원가입 설정 
passport.use('local-signup', new localStrategy({
    usernameField:'email',
    passwordField:'password',
    passReqToCallback:true
},function(req,email, password, done){
    var paramName = req.body.name || req.query.name;
    console.log('passport login-signup 호출됨 ');
    
    process.nextTick(function(){
        var database = app.get('database');
        database.userModel.fineOne({'email':email}, function(err, user){
            if(err) { return done(err);}
            
            //기존에 이메일이 있다면 
            if(user){
                console.log('이멜이 이미 있습니다 ');
                return done(null, false, req.flash('signUpMsg', '계정이 이미 있습니다'));
            }else{
                //모델 인스턴스 객체 만들어 저장 
                var user = new database.userModel({'email':email, 'password':password, 'name':paramName});
                user.save(function(err){
                    if(err){throw err;}
                    
                    console.log('사용자 데이터 추가함 ');
                    return done(null, user );
                });
            }
        });
    });
}));

 

done 메소드를 통해 결과를 알 수 있다.

4종류의 return.

}function(req,email, password, done){  
    var database = app.get('database');
    database.userModel.findOne({'email':email}, function(err,user){
        if(err){return done(err)};
        
//등록된 사용자 없는 경우      
return done(null, false, req.flash('loginMsg', '등록된 계정이 없습니다 '))       
//비밀번호가 일치하지 않는 경우   
return done(null, false, req.flash('loginMsg', '비번이 일치하지 않습니다'));            
//정상인 경우
return done(null, user);

 

인증 성공시 

세션이 만들어지고 사용자 정보를 세션에 저장한다. (Serialize)

나중에 세션에서 그 정보를 가져올 수도 있다.(deserialize)

//사용자 인증에 성공했을시 
passport.serializeUser(function(user, done){
    console.log('serializeUser 호출됨');
    console.log(user);
    
    done(null, user);
});

//사용자 인증 후 요청이 있을때마다 호출 
passport.deserializeUser(function(user, done){
     console.log('deserializeUser 호출됨');
    console.log(user);
    
    done(null, user); 
});
반응형

'IT > web' 카테고리의 다른 글

Node.js] 플래쉬 메시지  (0) 2020.02.08
Node.js] 라우팅 개념 다시 한번  (0) 2020.02.08
Node.js ] 뷰 렌더링 // ejs, pug  (0) 2020.02.06
Node.js] config 설정파일 분리하기  (0) 2020.02.04
Node.js] 모듈화  (0) 2020.02.02

댓글