1. 패스모듈 사용
- npm 모듈 설치
npm install passport --save npm install passport-local --save npm install connect-flash --save
- passport 모듈에는 initialize() 함수와 session() 함수가 있으며, 이 두개의 함수를 호출했을 때 반환되는 객체를 미들웨어로 사용할 수 있도록 설정
//===== Passport 사용 설정 =====//
// Passport의 세션을 사용할 때는 그 전에 Express의 세션을 사용하는 코드가 있어야 함
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
- 사용자 로그인과 회원가입 처리과정
- passport 객체에는 serializeUser()와 deserializeUser() 메소드를 쓸수있다.
- serializeUser() : 메소드를 호출하면서 등록한 콜백 함수는 사용자 인증이 성공적으로 진행되었을 때 호출
- deserializeUser() : 사용자 인증 이후 사용자 요청이 들어올 때마다 호출
// 사용자 인증 성공 시 호출
// 사용자 정보를 이용해 세션을 만듬
// 로그인 이후에 들어오는 요청은 deserializeUser 메소드 안에서 이 세션을 확인할 수 있음
passport.serializeUser(function(user, done) {
console.log('serializeUser() 호출됨.');
console.dir(user);
done(null, user); // 이 인증 콜백에서 넘겨주는 user 객체의 정보를 이용해 세션 생성
});
// 사용자 인증 이후 사용자 요청 시마다 호출
// user -> 사용자 인증 성공 시 serializeUser 메소드를 이용해 만들었던 세션 정보가 파라미터로 넘어온 것임
passport.deserializeUser(function(user, done) {
console.log('deserializeUser() 호출됨.');
console.dir(user);
// 사용자 정보 중 id나 email만 있는 경우 사용자 정보 조회 필요 - 여기에서는 user 객체 전체를 패스포트에서 관리
// 두 번째 파라미터로 지정한 사용자 정보는 req.user 객체로 복원됨
// 여기에서는 파라미터로 받은 user를 별도로 처리하지 않고 그대로 넘겨줌
done(null, user);
});
- 로컬인증방식
- passport 객체의 use()메소드를 호출하면서 전달하는 파라미터는 두 개인데 첫 번째는 이름이고 두 번째는 인증방식을 정의한 객체
- done() 메소드는 오류가 발생했을 때 첫 번째 파라미터만 전달하고, 정상적으로 인증되었을 때는 첫번째 파라미터를 null로, 두 번째 파라미터에는 사용자 객체를 전달
ex) return done(null, false, req.flash('loginMessage', '비밀번호가 일치하지 않습니다.'));
-> 이메일계정이나 비밀번호가 일치하지 않는다면 첫번째 null, 두번째 파라미터를 false, 세번째 파라미터에는 flash()함수를 사용해 메시지를 넣는다.
//===== Passport Strategy 설정 =====//
var LocalStrategy = require('passport-local').Strategy;
//패스포트 로그인 설정
passport.use('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', '등록된 계정이 없습니다.')); // 검증 콜백에서 두 번째 파라미터의 값을 false로 하여 인증 실패한 것으로 처리
}
// 비밀번호 비교하여 맞지 않는 경우
var authenticated = user.authenticate(password, user._doc.salt, user._doc.hashed_password);
if (!authenticated) {
console.log('비밀번호 일치하지 않음.');
return done(null, false, req.flash('loginMessage', '비밀번호가 일치하지 않습니다.')); // 검증 콜백에서 두 번째 파라미터의 값을 false로 하여 인증 실패한 것으로 처리
}
// 정상인 경우
console.log('계정과 비밀번호가 일치함.');
return done(null, user); // 검증 콜백에서 두 번째 파라미터의 값을 user 객체로 넣어 인증 성공한 것으로 처리
});
}));
- 라우팅 함수 초기 설정 및 홈화면 라우팅 함수 설정
//라우팅 정보를 읽어 들여 라우팅 설정
var router = express.Router();
route_loader.init(app, router);
//===== Passport 관련 라우팅 =====//
// 홈 화면 - index.ejs 템플릿을 이용해 홈 화면이 보이도록 함
router.route('/').get(function(req, res) {
console.log('/ 패스 요청됨.');
res.render('index.ejs');
});
- 로그인 관련 라우팅 함수 설정
1) post 방식으로 요청할 때는 passport 객체의 authenticate() 메소드를 호출하여 패스포트 모듈에서 사용자 인증을 처리하도록 넘겨줌
2) 첫번째 파라미터는 사용하고자 하는 이름, 두번째 파라미터는 전달되는 객체안에 사용자 인증이 성공햇을 때 /profile 패스로 이동, 실패했을때 /login 패스로 이동
// 로그인 화면 - login.ejs 템플릿을 이용해 로그인 화면이 보이도록 함
router.route('/login').get(function(req, res) {
console.log('/login 패스 요청됨.');
res.render('login.ejs', {message: req.flash('loginMessage')});
});
// 사용자 인증 - POST로 요청받으면 패스포트를 이용해 인증함
// 성공 시 /profile로 리다이렉트, 실패 시 /login으로 리다이렉트함
// 인증 실패 시 검증 콜백에서 설정한 플래시 메시지가 응답 페이지에 전달되도록 함
router.route('/login').post(passport.authenticate('local-login', {
successRedirect : '/profile',
failureRedirect : '/login',
failureFlash : true
}));
- 사용자 프로필을 보여주기 위한 라우팅 함수 설정(로그인 확인)
router.route('/profile').get(function(req, res) {
console.log('/profile 패스 요청됨.');
// 인증된 경우, req.user 객체에 사용자 정보 있으며, 인증안된 경우 req.user는 false값임
console.log('req.user 객체의 값');
console.dir(req.user);
// 인증 안된 경우
if (!req.user) {
console.log('사용자 인증 안된 상태임.');
res.redirect('/');
return;
}
// 인증된 경우
console.log('사용자 인증된 상태임.');
if (Array.isArray(req.user)) {
res.render('profile.ejs', {user: req.user[0]._doc});
} else {
res.render('profile.ejs', {user: req.user});
}
});
- 로그아웃 라우팅 함수 설정
router.route('/logout').get(function(req, res) {
console.log('/logout 패스 요청됨.');
req.logout();
res.redirect('/');
});
'WEB > Node JS' 카테고리의 다른 글
Nodejs기초 - 15일차 정리(채팅 1대1) (0) | 2019.02.04 |
---|---|
Nodejs기초 - 14일차 정리(페이스북 활용) (2) | 2019.01.28 |
Nodejs기초 - 12일차 정리(pug템플릿 사용 및 상속, 패스포트 정의) (0) | 2019.01.26 |
Nodejs기초 - 11일차 정리(Semantic UI 활용, MVC패턴, 응답 페이지 모듈화[ejs]) (0) | 2019.01.26 |
Nodejs기초 - 10일차 정리(Require 이해, 모듈화분리 패턴) (0) | 2019.01.24 |