[NodeJs] Passport-local 로그인 흐름 without session settings

Darcy Daeseok YU ·2023년 1월 18일
0

passport & passport-local 로그인

개념을 먼저 잡자면 ...

LocalStrategy : req.body에서 props(id,pwd) 가져와서 DB조회 후 결과값 반환

LocalStrategy는
req.body에서 아이디와 비밀번호 property의 값을 가져와서
DB 조회 한후 결과값을 done 함수로 전달함.
LocalStrategy의

  • done(서버에러 | null , 유저정보 | null , info)

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() ; // 다음 미들웨어로      
}

아래는 전체 흐름

  1. POST : /login 으로 호출
    req.body안에 {email : 'abc@gmail.com' , pwd : 'abc' }있음
    props 명에 신경쓸 것.
  2. app.post('/login)에서
passport.authenticate(
	'local' , 
	(err,user,info)=>{ 전략 실행 후 결과에 따른 로직구현} 
)
  1. 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)=>{}))
  1. done(서버에러, 유저정보에러, info)로부터 전달받은 파라미터
    app.post('/login')에서
    passport.authenticate('local',callback)의 콜백에서 받아서 사용한다

    LocalStrategy의 done(서버에러 | null , 유저정보 | null , info)
    passport.authenticate의 callback 형태 : (err, user, info)=>{ // 로그인로직 & session설정 etc. }

profile
React, React-Native https://darcyu83.netlify.app/

0개의 댓글