본문 바로가기
개발/Node.js

[Node.js] 패스포트 (passport) 사용법 - 로컬 인증 방식

by 윤호 2021. 1. 21.

패스포트 사용법을 간단히 알아보겠습니다. 원리는 다루지 않고 구현하는 코드에 대해서만 다룰 것입니다.

목차

  • 패스포트 초기 설정
  • 로그인과 회원가입 설정

패스포트 초기 설정

먼저 필요한 모듈을 설치합니다. 차례대로 passport 모듈, 로컬 인증 방식 사용을 위한 passport-local 모듈, flash 메시지를 전달하기 위한 connect-flash 모듈입니다.

npm install passport --save
npm install passport-local --save
npm install connect-flash --save

 

다음은 패스포트를 사용하기 위한 코드입니다.

// 패스포트 사용
var passport = require('passport');
var flash = require('connect-flash');

// express 객체
var app = express();

// 패스포트 사용 설정
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

passport.initialize는 패스포트를 초기화 하는 미들웨어고, passport.session()은 로그인 세션을 유지할 때 필요한 미들웨어입니다.

로그인과 회원가입 설정

다음은 로컬 인증 방식으로 로그인을 설정하는 코드입니다.

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

var local_login = new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // 아래 콜백 함수의 첫번째 파라미터로 req 객체 전달됨
}, function(req, email, password, done){
    console.log('passport의 local-login 호출됨 : ' + email + ', ' + password);

    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('loginMessage', '등록된 계정이 없습니다.'));
        }

        var authenticated = user.authenticate(password, user.salt, user.hashed_password);

        // 비밀번호가 틀린 경우
        if (!authenticated){
            console.log('비밀번호 일치하지 않음.');
            return done(null, false, req.flash('loginMessage', '비밀번호가 일치하지 않습니다.'));
        }

        console.log('계정과 비밀번호가 일치함.');
        return done(null, user);
    });
});

// 패스포트 로그인 설정
passport.use('local-login', local_login);

이메일과 패스워드를 받아 데이터베이스에 일치여부를 확인하고 경우에 따라 done 함수를 반환합니다. 이 done 함수는 로그인 성공시 passport에 사용자 정보를 전달합니다. 로그인 실패 시 done 함수에 user를 넣지 않고 반환합니다. 그리고 passport에서 user가 존재 여부에 따라 인증 상태를 확인할 수 있습니다.

 

설정한 인증 방식을 다음과 같이 사용할 수 있습니다.

app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/profile',
    failureRedirect : 'login',
    failureFlash : true
}));

 

인증이 성공할 경우 passport.serializeUser와 passport.deserializeUser로 로그인 세션을 저장하고 복원합니다. 따라서 인증 방식을 사용하기 전에 passport.serializeUser와 passport.deserializeUse를 설정해야합니다.

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

    done(null, user);
});

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

    done(null, user);
});

Reference

 

  • Do it! Node.js 프로그래밍

 

 

 

댓글