TIL[002] 21.03.06

Bewell·2021년 3월 6일
0

TIL

목록 보기
2/6

serializeUser & deserializeUser

serializeUser

passport strategy에서 성공 시 실행되는 done(null, user)에서 user객체를 전달받아 세션(req.session.passport.user)에 저장

passport.serializeUser((user, done) => {
  return done(null, user)
})

deserializeUser

실제 서버로 들어오는 요청마다 세션정보를 실제DB의 데이터와 비교, 해당 유저 정보가 있으면 done의 두번째 인자를 req.user에 저장

passport.deserializeUser((user, done) => {
  done(null, user)
})

serializeUser에서 done으로 넘겨주는 user가 deserializeUser의 첫번째 인수로 전달되기 때문에 둘의 타입이 항상 일치해야 한다.


done

passport에서 done은 세개의 인자를 받을 수 있는데,
  1. 첫번째 인자는 서버에러 발생에 대한 부분. 에러가 나지 않았다면 null값이 들어간다.
  2. 성공했을 때 return 할 값을 넣는다.
  3. 사용자가 로직에 의해 만들어낸 에러를 표현하고 싶을 때 사용.

passport login 로직

프론트에서 /user/login로 id와 pw을 POST요청으로 넘긴다면, 처음에는 router가 실행된다.

//  /router/user.js
router.post('/login', (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if (err) {
      console.error(err)
      return next(err)
    }
    if (info) {
      return res.status(401).send(info.reason)
    }
    return req.login(user, loginError => {  //  req.login에서 passport/index.js의 passport serializeUser가 실행된다
      if (loginError) return next(loginError)
      const filteredUser = Object.assign({}, user)
      delete filteredUser.password
      return res.json(filteredUser)
    })
  })
})

passport의 local strategy(전략)이 실행된다.

// /passport/local.js
module.exports = {
  passport.use(new LocalStrategy({
    usernameField: 'userId',
    passwordField: 'password'
  }, async (userId, password, done) => {
    try {
      return done(null, user)
    } catch (e) {
      ...
    }
  }))
}

local strategy(전략)에 의해 비밀번호를 비교 후 이상없는 경우 return done(null, user)를 실행하면, 다시 /router/user.js/login 라우터가 실행되고 req.login시점에 passport.serializeUser가 실행된다.

module.exports = () => {
  passport.serializeUser((user, done) => {  //  서버쪽에 [{ id:3, cookie: 'asdfasdf' }]
    return done(null, 'hello')
  })
  ...

그리고 route 하단의 로직이 마지막으로 실행된다.

0개의 댓글