npm - Passport

GitHub - jaredhanson/passport: Simple, unobtrusive authentication for Node.js.

'Node.js/Passport' 카테고리의 글 목록

사용 순서

app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: 'test',
  cookie: {
    httpOnly: true
  },
}));

var passport = require('passport');
var LocalStrategy = require('passport-local');

app.use(passport.initialize());
app.use(passport.session());
// session middleware 밑에 선언한다. 
// passport가 내부적으로 session을 사용하기 때문

// session 객체의 passport key에 user 식별자를 심어넣는 곳
passport.serializeUser(function(user, done) {
	console.log('serializeUser',user);
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log('deserializeUser',id);
  done(null, authData);
});

passport.use(new LocalStrategy(
	{
		usernameField : 'id',
		passwordField : 'pwd',
	},
	function (username, password, done) {
  		console.log('LocalStrategy',username, password);
  		if (username === authData.id) {
			console.log(1);
			if (password === authData.password) {
				console.log(2);
				
				return done(null, authData, {
				message : 'welcome'
			 	})	
			} else {
				console.log(3);
				return done(null, false, {
				message : 'Incorrect password'
			 	})	
			}
		} else {
			console.log(4);
			return done(null, false, {
				message : 'Incorrect username'
			})
		}
  }
));

app.post('/auth/login_process', passport.authenticate('local', {
  successRedirect : '/', // 성공시 이 루트로
  failureRedirect : '/auth/login', // 실패시 이 루트로
  failureFlash : true // 로그인 실패시 flash message 사용
}));

app.get('/auth/logout', (req, res) => {
	try{
		req.logout(function(err) {
		if (err) { return next(err); }
			req.session.save(() => {
				res.redirect('/');
			});
		}); 
		
		
	} catch(err) {
		console.error(err);
	}
})

1. /auth/login_process 로 요청이 들어온다

passport.authenticate 미들웨어가 이를 받아서 ‘local’ strategy를 수행한다.

2. passport의 new LocalStrategy의 객체로 req.body의 id와 pwd data가 들어간다.

req.body의 key값은 유저가 custom할 수 있다.

3. user가 입력한 id와 pwd가 DB의 데이터와 다르다면 failureRedirect로 설정한 path로 이동하고, 같다면 serialized 한다

이동하기 전, session 객체에 심어져있는 passport 객체에 req.user 객체가 심어진다.

후에 다른 라우터에서 로그인이 된 상태라면 req.user 객체에서 사용자 정보를 얻어낼 수 있다.

4. 이 후 매 요청마다 deserialized를 통해 사용자 권한을 확인한다.