Programming/Node.js
Node.js : Passport를 이용한 사용자 인증
파란크리스마스
2019. 2. 16. 19:18
728x90
출처
- 조대협의 블로그 :: 빠르게 훝어 보는 node.js - #14 - Passport를 이용한 사용자 인증 구축
- node.js - passport.js passport.initialize() middleware not in use - Stack Overflow
- Node.js + passport.js 를 이용한 소셜 로그인 구현 (페이스북, 깃허브, 구글)
- Passport를 이용한 네이버, 카카오, 페이스북 로그인 - Yun Blog | 기술 블로그
/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;