--저장된 사용자의 정보에 따라 로그인에 성공을 하면
위와 같이 passport.initialize() 라는 미들웨어가 사용되지 않았다는 에러가 나온다
1.app.use(passport.initialize()); 로 express에다가 passport라는 미들웨어를 설치하도록 한다
그러면 express가 호출될때마다 passport가 실행되고
passport는 session을 기반으로 실행되기 때문에 app.use(passport.session());으로 이를 사용
할 수 있도록 한다
3.로그인이 성공하면 passport가 내부적으로 우리에게 성공여부의 상태를 알아낼 수 있는
방법을 제공한다
로그인이 성공하면 홈으로 가도록 설정했기 때문에 홈에서 무슨일이 일어나는지 보자
console.log('/',request.user)로 리퀘스트객체에 유저라는 속성이 들어가 있는지 체크해보자
다시 로그인 해보면 Failed to serialize user into session이라는 에러 송출
즉 사용자에 대한 정보를 session으로 저장을 해야하는데 현재까진 session에 대한 셋팅이 안되
있는것이다.
4.passport가 내부적으로 session을 이용할때는 무엇을 써야하는지 passportjs.org에서 검색해보면
passport.serializeUser()와
pssport.deserializeUser()를 사용하도록 약속되어 있다.
5.그리고 passport가 내부적으로 session을 이용하려면 serialize가 필요하다(*참조 passportjs.org)
따라서 관련 코드를 사용하도록 작성하면 아래와 같으며
우리가 변환하여 작성해야할 부분은 주석처리 한다
6.로그인에 성공했을때 serializeUser라는 메소드의 인자로 전달된 콜백함수가 호출되도록
약속되어 있다 이를 console.log(user)로 확인해보자
그리고 deserializeUser는 언제 호출되는지 알아보자
이후 로그인을 해보면 serializedUser함수가 호출되며 즉 passport는 로그인에 성고했다면
authData를 seirializeUser의 콜백함수의 첫번째 인자로 주입해주도록 약속 되어 있다
(*즉 authData = user)
그리고 serializeUser의 두번째 인자로 done()을 추가하여 done()의 첫번째 인자로 null을 주고
두번째 인자로는 각각의 사용자를 식별할 수 있는 식별자를 주어야하는데 우리의 식별자는
email이므로 user.email을 두번째 인자로 준다
그리고 기존에 있던 session폴더 내부의 파일과 크롬내부 쿠키를 삭제하고 리로드를 해보면
session 폴더에 파일이 생기면서 쿠키가 구워진다 이 쿠키값이 식별자고 이 쿠키값과 대응되는
파일이 생기는것이다
그리고 로그인을 해보면 done()함수가 실행되면서 session 폴더 안의 파일에 passport의 user값으로
사용자의 식별자인 user.email이 생성되며
deserializeUser라는 함수도 실행이 되는데 이것은 무엇이냐
로그인 성공후 페이지에 방문할 때마다 deserializeUser라는 콜백이 호출되도록 약속되어 있으며
그럼 호출될때마다 우리는 사용자의 정보가 저장되어 있는 authData에서 사용자의 실제데이터를
조회해서 가져오는 것이다.
그리고 deseriailizeUser의 두번째 인자로 done() 을 주는데 done의 첫번째 인자로 null을 주고
두번째 인자로 식별자의 값을 id값으로 주도록 약속되어 있는데 실제로는 사용자의 정보를 조회해서
가져오는게 정석이지만 우리는 간단하게 authData로 사용자 정보를 정의해 놓았기 때문에
authData를 그대로 주입한다
이 후 로그인에 성공하고 리로드 할때마다(페이지에 들어갈 때 마다)deserializeUser가 호출되는 것을 알 수 있다.
&&추가(내소스코드인데 46번째줄을 아래 소스코드로 변경해야함)
&&
*로그인 성공시에 session 파일의 쿠키 객체에 passport 속성이 만들어 지지 않는 오류가 발생 동시에
deserializeUser도 호출되지 않는 문제가 발생
*위 문제 해결
yooncoding.tistory.com/112?category=936611
Node.js -passport sessions에 passport가 저장되지도 않고 deserialize 도 안나오는 오류해결
npm install -save connect-loki 설치 session-store.db를 생성하고 그 안에 데이터 저장!! 이러면 오류 없음 기존 sessions-file-store 는 윈도우 10과 호환성에 오류가 있다고 함
yooncoding.tistory.com
0.successRedirect:'/' 부분을 주석처리하고
faliluerFlash~~ 부분 코드 추가
0.pm2 를 킬때 pm2 start main.js --watch --ignore-watch="data/* sessions/*" --no-daemon
로 session 디렉토리가 재시작되지 않도록 시작
다시한번 정리하자면
1. 우리는 var passport = require('passport')를 통해 passport를 설치 후 모듈을 가져왔다
2. app.use(passport.intialize());로 express에 passport를 쓰도록 하고
3. app.use(passport.session()); 을 통해 session을 내부적으로 사용하도록 했다
4. app.post('/auth/login_process',
passport.authenrticate('local', {
successRedicret : '/',
failuerRedirect:'/auth/login'})));
를 통해서 사용자가 전송한 정보를 passport가 받도록 했고 성공하면 '/' 로
실패하면 /auth/login 으로 보내도록 했다 그리고 우린 local 전략을 쓰기로 했다
5.passport.use(new LocalStrategy)를 통해 로컬전략을 사용토록하고 실제로 사용자가 데이터를
전송할때마다 이 것의 두번째 함수가 호출되는데 그때의 username으로 들어온 값과 password의
값을 우리가 보관하고 있는 실제의 username 과 password의 값을 비교하여
만약 값이 같다면 세번째 인자의 done의 두번째인자로 사용자의 실제 데이터를 주입해주면 된다
6.done이 호출되면 passport가 serializeUser의 콜백함수를 호출하도록 되어 있고 이 콜백함수의
첫번쨰 인자로 5번에서 준 authData 데이터 값을 주면된다 그럼 우리는 그 데이터에서
사용자의 식별자 값을 추출해서 done이라는 함수를 호출하면 session 데이터의 쿠기 passport속성의
값으로 들어간다
7.즉 serializeUser는 로그인에 성공했다는 사실을 세션스토어에 저장하는 기능을 한다
따라서 로그인에 성공하면 serializeUser가 딱 한번 호출되고 이 후 다시 그 페이지가 호출될때마다
serializeUser로 인해 저장된 정보를 기준으로
로그인한 사용자인지 아닌지 체크를 하게 되는데 그때는 deserializeUser가 호출된다.
'WebApp > Node.js-passport' 카테고리의 다른 글
Node.js-passport 리펙토링(1) (0) | 2020.10.29 |
---|---|
Node.js -passport sessions에 passport가 저장되지도 않고 deserialize 도 안나오는 오류해결 (0) | 2020.10.25 |
Node.js-passport3 (0) | 2020.10.12 |
Node.js-passport (0) | 2020.10.07 |