패스포트 사용법을 간단히 알아보겠습니다. 원리는 다루지 않고 구현하는 코드에 대해서만 다룰 것입니다.
목차
- 패스포트 초기 설정
- 로그인과 회원가입 설정
패스포트 초기 설정
먼저 필요한 모듈을 설치합니다. 차례대로 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 프로그래밍
'개발 > Node.js' 카테고리의 다른 글
[Node.js] socket.io require 에러 해결법 (0) | 2021.01.22 |
---|---|
[Node.js] 모듈화 방법 - exports, module.exports (0) | 2021.01.22 |
[Node.js] 익스프레스로 웹 서버 만들기 2 - 자주 쓰이는 미들웨어 (0) | 2021.01.15 |
[Node.js] 익스프레스로 웹 서버 만들기 1 - 익스프레스 서버와 미들웨어 (0) | 2021.01.14 |
[Node.js] 뷰 템플릿 적용하기 - ejs 뷰 (2) | 2021.01.11 |
댓글