passport.js?
- Express.js 어플리케이션에 간단하게 사용자 사용자 인증 기능을 구현하게 도와주는 패키지
- 유저 세션 관리 및 다양한 고르인 방식 추가 가능
passport-local
- passport는 다양한 로그인 방식을 구현하기 위해 strategy라는 인터페이스를 제공
- strategy 인터페이스에 맞게 설계된 다양한 구현체들이 있음(facebook, google)
passport-local은 username, password를 사용하는 로그인의 구현체
로그인 구현하기
- 로그인 화면 구성하기
- check 함수로 로그인 유효성 검사!!!
- email값, pw값 가져와서 이메일,pw input이 비어있는지 확인
- passport-local strategy로 로그인 구현하기
cosnt config = {
usernameField : 'email',
passwordField:'password'
};
const local = new LocalStrategy(config, async(email, password, done) => {
try{
const user = await User.findOne({email});
if(!user){
throw new Error("회원을 찾을 수 없습니다.");
}
if(user.password !== password){
throw new Error("비밀번호가 일치하지 않습니다.");
}
done (null, {
shortId : user.shortId,
email : user.email,
name : user.name,
});
} catch (err) {
done(err, null);
})
- passport.js 설정하기
- passport로 요청 처리하기
--- routes/auth.js ---
router.post('/',
passport.authenticate('local');
--- app.js ---
const session = require('express-session');
app.use(session({
secret: 'secret',
resave: false,
saveUninitialized: true
})); app.use(passport.initialize()); app.use(passport.session()); app.use('/auth', authRouter);
- session 유져 활용하기
- session을 이용해 user를 사용할 때에는 serializeUser와 deserializeUser를 설정해주어야 함
- 이는 세션에 user 정보를 변환하여 저장하고 가져오는 기능을 제공
ex) 회원 id만 세션에 저장하고, 사용 시 회원정보를 디비에서 찾아서 사용
passport.serializeUser((user, callback) => {
callback(null, user);
});
passport.deserializeUser((obj, callback) => {
callback(null, obj);
});
- 로그아웃
- passport는 req.logout 함수를 통해 세션의 로그인 정보를 삭제하여, 로그아웃 기능을 구현할 수 있음
router.get('/logout', ...{
req.logout();
res.redirect('/');
});
- 로그인 확인 미들웨어
- 로그인을 필수로 설정하고 싶을 경우, 미들웨어를 사용하여 체크할 수 있음
function loginRequired(req, res, next) {
if (!req.user) {
res.redirect('/');
return;
}
next();
}
app.use('/posts', loginRequired, postsRouter);