req.isAuthenticated() returning false immediately after login

broccoli·2021년 4월 18일
0

etc@troubleshooting

목록 보기
2/9
post-thumbnail

passport local 전략으로 로그인 테스팅을 하는중 이상한 이슈를 발견했다.

이슈는 로그인을 성공했는데도 불구하고 req.user가 있었는데도 불구하고 리다이렉션시 로그인했던 세션이 사라진것이다. 구글링을 통해서 사례를 찾아보려했는데 개인적으로 레퍼런스가 잘 나오지 않았다.

레퍼런스통해서 해당이슈의대한 해결법을 확인했다....근데 좀 억울했던건 이미 알고 있던 함수긴 했다.

req.session.save()는 생활코딩에서도 언급이 되었었던 함수지만 passport 문서에는 해당 내용이 있지 않아서 ... 내부적으로 처리해줬을 것이라 막연히 믿었던게 실수였던거 같다.

해당 함수에 대해서 내부적으로 주석이 이렇게 달려있다.

  • Save the session back to the store, replacing the contents on the store with the contents in memory
  • (though a store may do something else - consult the store's documentation for exact behavior).
  • This method is automatically called at the end of the HTTP response if the session data has been altered
  • (though this behavior can be altered with various options in the middleware constructor).
  • Because of this, typically this method does not need to be called.
  • There are some cases where it is useful to call this method, for example: redirects, long-lived requests or in WebSockets.

session이 삭제되거나 변경될 때 로그아웃될 때도 항상 사용하는게 좋겠다.

다른 전략에서도 req.login() 내부 콜백에서 필요시 req.session.save(callback) 을 사용하는 것을 잊지말자.

req.login(user, (err) => {
  if (err) {
    console.log(err)
    next(err)
  }
  console.log('로그인마지막단계', req.session)
  // 여기 이 req.session.save(callback) 내부 콜백에서 redirect를 해줘야 문제가 발생하지 않는다.
  req.session.save((err) => {
    if (err) {
      console.error(err)
      next(err)
    } else {
      res.redirect(`/user/${user.id}`)
    }
  })
})
profile
🌃브로콜리한 개발자🌟

0개의 댓글