nodejs + express를 이용한 Google OAuth 연동
OAuth는 근간에 거의 모든 WebSite에서 사용되고 있는 인증방법입니다. 회원 가입절차를 빠르게 할 수 있으며, 개인정보에 대한 관리 이슈를 피할 수 있어, 많이들 사용되는 방법입니다. nodejs를 이용한 OAuth 인증 방법에 대해서 알아보도록 하겠습니다.
npm package 설치
npm install passport
npm install passport-google-oauth
npm install cookie-session
- passport: OAuth를 지원하기 위한 base package 입니다. twitter, facebook, google에서 지원하고 있는 OAuth를 모두 지원합니다.
- passport-google-oauth: passport를 기반으로 하는 google-oauth 지원 package입니다.
- cookie-session: express에서 session을 지원하기 위한 package입니다.
express-session
으로 대체해서 사용 가능합니다.
google auth api 설정
https://console.developers.google.com 에서 Google에서 제공하는 API를 이용하는 project를 생성할 수 있습니다. 새로운 project를 생성한 후, API 및 인증 > 사용자인증정보
에서 새클라이언트 ID 만들기
를 통해서 새로운 API를 만들어줍니다. 여기서 중요한 설정은 다음과 같습니다.
- 승인된 javascript 원본 : 인증을 요청할 url을 넣습니다. 개발자 환경인 http://localhost:3000 과 같은 표현 역시 가능합니다.
- 승인된 redirection URL : 인증이 완료된 후, redirect될 url을 넣어줍니다.
만들어진 웹어플리케이션용 Client ID에서 이제 3개의 정보는 우리가 작성할 application에서 사용해야지 됩니다.
- 클라이언트 ID
- 클라이언트 보안 비밀
- URI 리디렉션
Login uri handling
사용자가 OAuth를 통해서 인증될 URL을 설정합니다. express controller code에 해당되는 내용입니다.
module.exports = OAuthController;
function OAuthController(app) {
var passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());
// Google OAuth를 사용하는데 필요한 객체를 선언합니다.
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use(new GoogleStrategy({
clientID: '클라이언트 ID',
clientSecret: '클라이언트 보안 비밀',
callbackURL: 'URI 리다렉션'
},
function(accessToken, refreshToken, profile, done) {
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// req.session.passport 정보를 저장
// done 메소드에 전달된 정보가 세션에 저장된다.
// profile을 이용해서 사용자 정보를 DB에 넣는 등의 작업에 활용할 수 있다.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
return done(null, profile);
}));
// 인증 URI : uri link를 이곳에 넣어주면 됩니다.
app.get('/auth/google', passport.authenticate('google', {
scope: [
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'
]
}));
app.get('/oauth2callback', passport.authenticate('google', {
successRedirect: '/auth/successed',
failureRedirect: '/auth/failure'
}));
app.get('/logout', function(req, res) {
//
// passport 에서 지원하는 logout 메소드이다.
// req.session.passport 의 정보를 삭제한다.
//
req.logout();
req.session = null;
res.redirect('/');
});
};
Summary
Passport를 통해서 Google OAuth에 접근하는 방법은 많은 예시 code들이 있고, 거의 유사한 형태를 갖습니다. 위 controller code를 그대로 copy & paste로만도 간단히 Google OAuth를 구현 가능합니다.
Posted by Y2K