Node.js : Passport를 이용한 사용자 인증

Programming/Node.js 2019.02.16 19:18 Posted by 파란크리스마스

출처

/app.js

// 모듈 추가
const passport = require('passport');
const session = require('express-session');
var bodyParser = require('body-parser');

// ... 생략 ...

/*
cookieParser
session
passport.initialize
passport.session
app.route
 */
var app = express();

// ... 생략 ...

app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 세션 설정
app.use(session({
  secret: 'simpleSNS',
  resave: true,
  saveUninitialized: false
})); // 세션 활성화

require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session()); //로그인 세션 유지

app.use(bodyParser.urlencoded({extended: true}));

/public/login.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<form action="/login" method="post">
    <div>
        <label>UserId:</label>
        <input type="text" name="userid"/><br/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Submit"/>
    </div>
</form>
</body>
</html>

/config/passport.js

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

module.exports = (passport) => {

    // 로그인이 성공하면, serializeUser 메서드를 이용하여 사용자 정보를 Session에 저장할 수 있다.
    passport.serializeUser((user, done) => {
        console.log('serialize');
        done(null, user);
    });

    // 인증 후, 페이지 접근시 마다 사용자 정보를 Session에서 읽어옴.
    passport.deserializeUser((user, done) => {
        console.log('deserialize');
        done(null, user);
    });

    passport.use(new LocalStrategy({
            usernameField : 'userid',
            passwordField : 'password',
            passReqToCallback : true
        },
        
        // 인증 요청
        function(req, userid, password, done) {
            if(userid=='test' && password=='1111') {
                var user = {
                    'userid':'hello',
                    'email':'hello@world.com'
                };
                return done(null, user);
            }else{
                return done(null, false);
            }
        }
    ));
};

/routes/index.js

var express = require('express');
var router = express.Router();
const passport = require('passport');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

// 로그인
router.post('/login', passport.authenticate('local', {failureRedirect: '/login.html'}), (req, res) => {
  res.redirect('/login_suc.html');
});

/*
router.post('/login', passport.authenticate('local', {
  successRedirect: '/login_suc.html',
  failureRedirect: '/login.html'
}));
*/

// 로그아웃
router.get('/logout', (req, res) => {
  req.logout();
  res.redirect('/');
});

module.exports = router;

Facebook 로그인 적용

/config/passport.js 내용 추가

const FacebookStrategy = require('passport-facebook').Strategy;

module.exports = (passport) => {

// ... 생략 ...

    passport.use(new FacebookStrategy({
            clientID: "",
            clientSecret: "",
            profileFields: ['id', 'displayName', 'photos'],
            callbackURL: 'http://localhost:3000/markdown/auth/facebook/callback'
        },

        function (accessToken, refreshToken, profile, done) {
            const socialId = profile.id;
            const nickname = profile.displayName;
            const profileImageUrl = profile.photos[0].value;

            onLoginSuccess('Facebook', socialId, nickname, profileImageUrl, done);
        }
    ));

/routes/index.js 내용 추가

// ... 생략 ...

// 로그아웃
router.get('/logout', (req, res) => {
  req.logout();
  res.redirect('/');
});

// 페이스북 로그인 시작
router.get('/facebook', passport.authenticate('facebook'));

// 페이스북 로그인 결과 콜백
router.get('/facebook/callback', passport.authenticate('facebook', {
    failureRedirect: '/markdown/auth/login'
}), (req, res) => {
    loginSuccessHandler(req, res);
});

module.exports = router;