WEB5 - Express passport.js

passport.js 세션이용

수업소개

Passport.js는 내부적으로 express-session을 이용합니다. 여기서는 두개의 미들웨어를 연결하는 방법을 알아봅니다. 

 

 

pm2, node-mon과 같은 자동 재시작 도구를 사용하는 경우 세션 정보가 저장이 안되는 현상이 발생할 수 있습니다. 이유는 sessions 디렉토리에 파일이 추가되면 node가 재시작 되기 때문입니다. 이를 해결하기 위해서 sessions 디렉토리에 대해서는 재시작을 하지 않도록 조치해야 합니다. 아래 수업을 참고해주세요. 

https://opentutorials.org/course/3332/22110

 

 

 

강의 1

 

 

 

소스코드

변경사항

 

 

 

강의 2

 

 

 

강의 3

 

 

 

소스코드

변경사항

댓글

댓글 본문
  1. freebear
    그런데.. 다 좋은데요.
    이렇게 바꾼후에 로그인시에

    app.use(function (req, res, next) {
    var script = `
    <script>
    alert("We can't found it");
    location.href ='/';
    </script>
    `
    res.status(404).send(script);
    });

    요부분.. 마지막에 넣은 예외처리가 실행되더라구요..
    물론 session 에 데이터는 잘 저장되어 있습니다만...
    혹 이게 어째서인지 아시는 분?
    대화보기
    • freebear
      deserializeUser 부분이 동작 안되는 경우

      저는 로그인을 실행한 뒤 session 파일에 로그인 정보가 저장이 되기도 하고 안되기도 하고 하는 현상이 있었습니다. session에 제대로 저장이 된 경우에는 deserializeUser 가 제대로 동작하였지만 아닌 경우는 당연히도 동작하지 않더군요..

      로그인/로그아웃 시 둘 다 발생한 문제인데
      session 에 정보가 변경되기 전에 redirect 되어 버리면서 문제가 되는 것 같습니다.
      로그아웃 강좌의 끝에 egoing 님이 설명해주신 부분을 login 시에도 적용하여

      app.post('/login_process',
      passport.authenticate('local', {
      failureRedirect: '/login',
      function(request,response){
      request.session.save(function(){
      response.redirect(`/`);
      })
      }
      })
      );
      -> 요렇게 변경하였습니다.
      로그인 성공시 -successRedirect: '/' 에서 session save 확인후 redirect 로요
      대화보기
      • 김윤석
        21.04.22
      • jeisyoon
        2021.03.23 Passport.js 세션 이용 - OK
      • Haewon Lee
        하... deserialize 함수가 호출 안되는데 답변좀 주세요 ....... 구글에도 검색해보니 엄청 얘기많던데
      • 생활둘기
        2021 1 7
      • 우정현
        session-store로 session-file-store를 사용하고 있습니다.

        그 특성상, session에 정보가 저장되지 않았음에도 불구하고 바로 리디렉션되어 로그인이 되지 않는 상황이 발생합니다.

        이런 경우에는 로그인 처리 시, 세션을 저장하고 콜백을 호출해서 리디렉션 하는 방식으로 하면 세션에 저장되고 난 후 리디렉션 될 것입니다.

        (pm2 start main.js --watch --no-daemon --ignore-watch "data/* sessions/*" 로 실행합시다)

        app.post('/login_process', passport.authenticate('local', {failureRedirect : '/auth/login'}) , (req, res) => {
        req.session.save( () => {
        res.redirect('/')
        })
        })
      • Yong Hyun Lee
        완료
        201212
      • 퍼스니
        app.post('/login_process',
        passport.authenticate('local'),
        function(req, res) {
        console.log(req.user);
        req.session.save(function(){
        console.log('success');
        res.redirect('/');
        })
        });

        이렇게 수정해서 무제 해결 하였습니다.
      • 퍼스니
        app.use(session({
        resave: false,
        saveUninitialized: true,
        secret: 'sknfienf123',
        store: new FileStore()
        })
        );
        항목에서 saveUninitialized를 false로 변경해서 해결하였습니다.
      • 퍼스니
        클론 떠서 실행해봐도 세션에 email 추가가 안되고, deserialize도 실행이 안되네요... ㅠㅠ
      • ldhan0715
        20-09-21
      • 뚜루뚜루뚭
        감사합니다
      • 쑤우
        수강완료. 감사합니다~
      • pythondevs
        Have you heard about pythondevs.org? They have the best python developers for web and mobile development.

        https://pythondevs.org/
      • 굼벵이
        완료
      • 인걸
        deserialize 함수가 호출 안되는 문제

        1. CORS 허용
        2. 라우트 세션에서
        cookie: {
        secure: false
        }
        둘 중 다 하거나 하나를 해서 해결
      • 난마돌
        passport를 가장 잘 설명해주는 강의같습니다 . 최고!
      • Specialist
        어제 밤에 deserialize 호출되는건 해결했습니다.
        https://opentutorials.org......134 에 예전 passport강의가 있길래 봤는데 댓글을 보니까 저와 비슷한 문제를 겪으신 분들이 많아서 그거 참고해서 deserialize는 나오게 했어요.
      • 어떻게 도와드려야할지...deserialize 함수가 호출은 되고 있나요?
        대화보기
        • Specialist
          도와주세요... 저는 deserialize 부분의 console.log가 안나와요. 로그인 버튼 누르면 deserialize까지 같이 나와야 하잖아요. 근데 계속 안나와요 뭐가 문제인지 모르곘어요!! 도와주세요!!
        • Specialist
          이걸 8시간 째 하고 있는데도 안되네요... 진짜 미쳐버리겠네...
        • 세션에 저장하는건 문제가 안되는데 세션에 저장하기도 전에 redirect를 해서 그렇습니다.
          대화보기
          • jo_onc
            저도 오늘 다시 확인해보니 세션이 저장될 때가 있고 안 될때가 있고..
            왜 이럴까요?
            vscode, pm2 사용하는데, 제 PC의 문제일까요?
            대화보기
            • jo_onc
              pm2 start main.js --watch --ignore-watch="data/* sessions/*" --no-daemon
              적용해봐도, 로그인 후 갱신을 한 번 더 해야만 로그인 표시가 되네요..
              해결방법 아시는 분 계신가요?
              vscode, pm2 사용하고 있습니다.
            • nodejs + passport.js + cluster + mongodb 사용중인데
              클러스터 다른 worker로 바뀔때마다 로그인 풀려서

              connect-mongo 사용해서 해결했습니다.
            • 후루룽
              조금 어렵지만 흥미진진!! 감동적이에요
            • nomadlife
              저도 비슷한 문제가 있어서, 저는 로그아웃 후에 남아있던 쿠키를 강제로 지워버렸네요. (https://github.com......437) 증상은 해결이 됐는데,,실제 서비스에서도 이렇게 해도 되는건가요?

              nodemon 으로 ignore 옵션주는법은 nodemon main.js --ignore sessions/*.json 하거나,
              아니면 아예 package.json 파일에다가 추가해줘도 된다고 하네요.
              "nodemonConfig": {
              "ignore": ["sessions/*.json"]
              }
              (https://stackoverflow.com......les)
            • egoing
              정확한 진단입니다. 저도 수업에 내용을 보강할께요. 고맙습니다~
              대화보기
              • 포로리야
                더 좋은 방법을 찾았네요

                pm2 같은 프로세서 관리 프로그램 중에 파일이 수정되면 자동으로 restart하는 기능이 문제였습니다. (pm2는 --watch)

                session.save의 매커니즘이 어떻게 되는지는 모르겠지만

                미들웨어가 sessions 파일을 건드리면 pm2가 파일이 변경된것으로 인식해 재시작 되면서

                session에 serialize가 안되는 문제가 생깁니다.

                pm2 에 --watch를 넣지 않고 수동으로 재시작 해주던가

                pm2 --watch --igonore-watch="sessions/* db.json"

                이렇게 ignore 옵션을 넣어주면 해당 디렉토리의 모든 파일이나 지정된 파일이 수정되어도 무시합니다.
                대화보기
                • 포로리야
                  successRedirect 시에 세션정보가 local store에 저장되지 않는거 같네요.

                  passport.authenticate('local', {
                  failureRedirect: '/auth/login'
                  }),
                  (req, res, next) => {
                  req.session.save((err) => {
                  if (err) {
                  next(err);
                  }
                  res.redirect('/');
                  })
                  }
                  );

                  이런 콜백으로 save 시킬수도 있는데 찜찜하네요
                • 조언 감사합니다.
                  그러나 해당 코드를 반영해도 동일한 오류가 발견됩니다.
                  제 생각에는 기존 코드에도, 작성해주신 코드 모두 로그인 처리가 되었으나,
                  ui에 반영되는 타이밍이 이상한 것 같습니다.
                  egoing님의 코드를 다운받아서 실행해봐도 동일한 오류가 있는데,
                  왜 그런지 모르겠습니다. ㅠㅠ
                  대화보기
                  • ltaers@naver.com
                    저도 같이 공부하는 입장이라서 제가 한것이 맞는 방법인지는 모르겠습니다.
                    하지만 조금이나마 도움이 될까 적습니다.
                    main.js에 session중에 saveUninitialized가 true로 되어있을겁니다. 이것을 false로 바꾸고 store:new FileStore({path:'./sessions',logFn:function(){}})로 수정했습니다. lonFn을 빼실경우에는 console에 에러가 나와서 lonFn으로 뺏습니다.
                    true로 할경우 session을 미리 만드는것이도 false로 할경우는 session을 저장할때에 생성되게 한것입니다.


                    logout의 경우는 아래와 같이 작성했습니다.
                    아래와 같이 작성하면 session파일에 json파일 자체를 없어집니다.
                    router.get('/logout', function (request, response) {
                    request.logout();
                    request.session.destroy(function(err){
                    response.redirect('/');
                    });
                    });
                    대화보기
                    • 저도 동일한 오류가 있네요 ㅠㅠ 바로 화면이 바뀌지 않고, refresh를 해야 login ui가 변경되어 있는데,
                      어떻게 오류를 잡을 수 있을까요?
                      대화보기
                      • ltaers@naver.com
                        login시에 바로 로그인이 확인이 안되고 web을 한번 눌러줘야 로그인이 적용이됩니다.
                        그리고 어쩔때에는 session에 passport가 저장이 되고 어떤경우에는 passport가 저장이 안됩니다.
                        또한 한번 로그아웃을 할 경우 로그인이 되지 않는 경우가 발생하는데 이건 어떤식으로 해결해야할까요?
                        ps. 그래서 제가 짠코드가 이상한지 한번 이고잉님의 코드를 다운받아서 실행하였는데 같은증상이 발생합니다ㅠㅠ 제 컴퓨터의 문제인가요 ?? ㅜㅜ
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기