패스포트로 로그인하기
- http://passportjs.org/docs
- 노드애서 사용할 수 있는
사용자 인증 모듈
이다. - 간단하고, 인증 기능을 독립된 모듈 안에서 진행할 수 있도록 도와준다.
- 미들웨어로 끼워넣을 수 있어 간단한 설정만으로 로그인 기능을 만들 수 있다,
-
순전히 인증 기능만 담당 한다.
- 수백 가지의 인증 방식 제공한다. (전략 방식으로 어떤 인증 방식을 사용할지 결정한다.)
-
대표적으로는 데이터베이스 정보와 비교하는
로컬 인증 방식
, SNS 계정을 사용하능OAuth 인증 방식
이 있다. - 인증한 후 성공하면 사용자 정보를 세션에 저장 한다.
패스포트의 기본 사용 방법 살펴보기
- passport 모듈 설치
> npm install body-parser --save
> npm install passport --save
- 라우팅 함수를 등록하는 코드에
passport.authenticate()
를 호출 한다. local
은 데이터베이스에 정보와 비교하는로컬 인증 방식
을 사용한다.
// ...
app.post('/login', passport.authenticate('local')));
// ...
- 인증 실패시, 디폴트 값으로 401 Unauthorized 응답을 보낸다.
- 인증 성공시, 다음 라우팅 함수가 호출되며,
req.user
에 인증된 사용자 정보가 들어간다. - 인증 여부에 따라, 리다이렉트 시킬 수 있다.
// ...
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
}));
// ...
플래시 메시지와 커스텀 콜백 이해하기
- 리다이렉트를 사용하여 응답을 보낼 때는 보통
플래시 메시지
를 같이 사용한다.
> npm install connect-flash --save
// ...
app.post('/login', passport.authenticate('local', {
failureFlash: true
}));
// ...
- 별도의 콜백 함수 가 필요하다면, 다음과 같이 진행할 수 있다.
// ...
router.route('/login').post((req, res, next) => {
passport.authenticate('local', (err, user, unfo) => {
if (err) {
return next(err);
}
if (!user) {
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
return next(err);
}
return res.redirect('/users/' + user.username);
});
});
});
// ...
스트래지티 설정과 검증 콜백
- 여러가지 인증 방식 지원한다.
- 인증에 대한 스트래지티가 설정되어 있어야 한다. (
passport.use()
설정) 로컬 인증 방식
의 경우는passport-local 모듈
이 설치해야 한다.
> npm install passport-local --save
passport.use(new LocalStrategy(...
으로 해당 Strategy 설정할 수 있다.authenticate()
메소드가 호출되면 해당 Strategy에서 정의한 done 변수 에 의해 결과를 알 수 있다.
로컬 인증하기
- 몽고디비를 이용한 로컬 인증 방법이다. (관련 모듈을 설치해준다.)
- Strategy에
passReqToCallback: true
옵션을 변경 시, 콜백함수에 req 를 추가로 넘길 수 있다. authenticate()
에session: false
옵션을 변경 시, 세션을 저장하지 않는다.passport 모듈
추가
const session = require('express-session');
const passport = require('passport');
// ...
const app = express();
app.use(session({ secret: 'secret-heowc' }));
// passport 추가
app.use(passport.initialize());
// 세션에 저장 시, express-session 설정 추가
app.use(passport.session());
※ session에 저장하고자 한다면, express-session 모듈
을 추가하고 설정한다.
- 세션에 무엇을 저장, 복원할지 정의할 수 있다.
// 세션 저장
passport.serializeUser((user, done) => {
done(null, user);
});
// 세션 복원
passport.deserializeUser((user, done) => {
done(null, user);
});
- 라우터 콜백함수에서 세션 검증 시, 다음과 같이 조건 처리를 해줄 수 있다.
(req, res) => {
if (!req.user)
if (!req.isAuthentication())
if (req.isUnauthenticated())
}
패스포트 관련 코드 모듈화하기
- 패스포트 설정 파일을 분리한다. (09.express_with_pass - passport)
- 라우팅 파일을 분리한다. (09.express_with_pass - route)
페이스북으로 로그인하기
OAuth 인증
을 이용한 SNS(페이스북, 트위터, 구글, 네이버) 로그인이다.- 해당 모듈 추가를 한다.
> npm install passport-facebook --save
- 자세한 내용은 페이스북 개발자센터를 참고한다. (타 SNS 로그인도 동일하다.)