passport & passport-local 로그인
개념을 먼저 잡자면 ...
LocalStrategy : req.body에서 props(id,pwd) 가져와서 DB조회 후 결과값 반환
LocalStrategy는
req.body에서 아이디와 비밀번호 property의 값을 가져와서
DB 조회 한후 결과값을 done 함수로 전달함.
LocalStrategy의
done(err, user, info)
passport.authenticate : Strategy 실행 후 DB조회 결과값 받아서 처리(로그인, 세션 등)
'/login' 요청에 대해서
passport.authenticate('local')실행하여 loca strategy를 실행해서 db를 조회하게 하고
done()함수의 파라미터 값을 callback으로 받아 로그인 처리한다. (session처리도 여기서)
passport.authenticate('local', (err, user, info)=>{ // 로직 })
done(err, user, info) = done(서버에러 | null , 유저정보 | null , info)
passport.authenticate('local', (err, user, info)=>{// 로그인로직 & session설정 etc. })
에러 없으면 req.login 실행
여기서부터 passport 실질적인 로그인 절차
req.login(user, callback)실행과 동시에
passport.serializeUser(user,done) 실행됨
req.login()은 세션 키 생성하고 쿠키에 세션키 설정해서 클라이언트로 보냄
setHeader('Cookie', sessionKey) 설정
serializeUser()는 세션 정보 저장
세션 설정 : <sessionKey, user.id> 형식으로 저장함.
Login 후의 요청 시 : deserializeUser 매회 실행됨.
done(null, user정보) => req.user에 유저 정보 저장해줌
passport.deserializeUser((id, done) => {
// db조회
done(null, user정보);
)
deserializeUser 사용법
in routes/user.js
...
router.post(
"/login",
isNotLoggedIn, //미들웨어 추가하다.
(req,res,next) => {}
)
...
로그인 여부 체크 함수 만들어준다
in routes/middleware/checkLoggedIn.js
함수만 exports 해준다.
isLoggedIn() 로그인 되었으면 next()을 사용해서 다음 미들웨어로 이동.
isNotLoggedIn() 로그인 안되었으면 다음 미들웨어로 이동
next() vs next("router")
next() : 다음 미들웨어로 이동.
next("router") : 해당 로직에서 빠져나오고 다음으로 일치하는 router로 이동한다.
exports.isLoggedIn = (req,res,next) => {
if(!req.isAuthenticated()) {
return res.status(401).send('로그인이 필요합니다.';
}
next() ; // 다음 미들웨어로
}
exports.isNotLoggedIn = (req,res,next) => {
if(req.isAuthenticated()) {
return res.status(401).send('이미 로그인하셨습니다.';
}
next() ; // 다음 미들웨어로
}
아래는 전체 흐름
passport.authenticate(
'local' ,
(err,user,info)=>{ 전략 실행 후 결과에 따른 로직구현}
)
passport.user(new LocalStrategy()) 에 구현한 로직 실행 후 done함수로 결과값 반환
local strategy는 req.body값을 읽어
usernameField 와 passwordField에 설정한 prop명(key)와 value를 가져와서
callback함수: (email,pwd,done)=>{} 로 전달한다.
done()함수로 결과값을 반환하면 passport.authenticate('local',callback)의 callback 함수에 파라미터로 전달된다.
passport.user( new LocalStrategy(
//usernameField 와 passwordField에는 req.body에 일치하는 값 입력(없으면 에러)
{
usernameField: "email",
passwordField: "pwd"
},
(email, pwd,done)=>{}))
done(서버에러, 유저정보에러, info)로부터 전달받은 파라미터
app.post('/login')에서
passport.authenticate('local',callback)의 콜백에서 받아서 사용한다
LocalStrategy의 done(서버에러 | null , 유저정보 | null , info)
passport.authenticate의 callback 형태 : (err, user, info)=>{ // 로그인로직 & session설정 etc. }