회원인증 방법
세션 방식 로그인 기능 구현
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
app.use(session({secret : '비밀코드', resave : true, saveUninitialized : false}));
app.use(passport.initialize());
app.use(passport.session());
app.use(미들웨어)
미들웨어 : 요청 - 응답 중간에 뭔가 실행되는 코드
로그인을 하면 아이디 비번 검사
passport - 로그인 기능 쉽게 도와줌
아이디 비번 인증하는 세부 코드 (passport 라이브러리 예제코드)
인증방법은 Strategy 라고 부름
passport.use(new LocalStrategy({
usernameField: 'id',
passwordField: 'pw',
session: true,
passReqToCallback: false,
}, function (입력한아이디, 입력한비번, done) {
//console.log(입력한아이디, 입력한비번);
db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
if (에러) return done(에러)
if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
if (입력한비번 == 결과.pw) {
return done(null, 결과)
} else {
return done(null, false, { message: '비번틀렸어요' })
}
})
}));
done(서버에러, 성공 시 사용자 DB 데이터, 에러메시지)
두번째 파라미터에 아이디, 비번 틀리면 false 넣어야함
id, 비번 점검 시 user로 보냄 → 세션 데이터를 만들고 세션의 id 정보를 쿠키로 보냄
//세션을 저장시키는 코드 (로그인 성공 시 발동)
passport.serializeUser(function(user, done){
done(null, user.id)
});
//이 세션 데이터를 가진 사람을 DB에서 찾아주세요마이페이지 접속 시 발동
passport.deserializeUser(function(id, done){
done(null, {})
});
쿠키는 검사 → 어플리케이션 → 쿠키 에서 확인 가능
value가 세션 아이디
마이페이지 접속 전 실행할 미들웨어
app.get('/mypage', logincheck, function(req, res){ // 미들웨어 쓰는 법
res.render('login.ejs')
});
function logincheck(req, res, next){
if (req.user){ //req.user가 있는지 확인
next() //다음으로 통과
} else { //없다면 에러메시지
res.send('로그인 안하셨는데용')
}
}
로그인 후 세션이 있으면 req.user가 항상 있음
//세션을 저장시키는 코드 (로그인 성공 시 발동)
passport.serializeUser(function(user, done){
done(null, user.id)
});
//이 세션 데이터를 가진 사람을 DB에서 찾아주세요마이페이지 접속 시 발동
passport.deserializeUser(function(id, done){
//디비에서 위에 있는 user.id로 user를 찾은 뒤 유저 정보를 ret에 넣음
db.collection('login').findOne({id : id}, function(error, ret){
done(null, ret);
});
});
deserializeUser() : 로그인한 유저의 세션 아이디를 바탕으로 개인정보를 DB에서 찾는 역할
user.id 가 passport.deserializeUser(function(id, done))의 id로 전달
로그아웃을 구현하던 중
app.post('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
여기서 자꾸 오류가 나서 검색해보니 업데이트 후 동기식이었던 req.logout()이 비동기식 기능으로 바꼈다는 것을 들었다
이렇게 수정하니 됨
app.post('/logout', function(req, res) {
req.logout(function(err) {
if (err) { return next(err); }
res.redirect('/');
});
});
회원가입은 이렇게 구성하였다
app.get('/signup', function(req, res){
res.render('signup.ejs');
});
app.post('/signup', overlap_check, function(req, res){
res.send('signup complete');
db.collection('login').insertOne({id : req.body.id, pw : createHashedPassword(req.body.pw)}, function(error, res){ // Object 자료형, req.body라고 하면 요청했던 form에 적힌 데이터 수신가능
console.log('save complete');
if (error){return console.log(error)};
});
});
아이디 중복 처리