생활코딩

Coding Everybody

Passportjs

토픽 생활코딩 > 서버 > JavaScript (nodejs) - 폐지예정

Passport Introduction(패스포트 소개)

 Configuration(설정)

Route

Serialize

logout(로그아웃)

review ( 복습) 

댓글

댓글 본문
  1. 굼벵이
    완료
  2. NGiveup
    어렵네요.
    잘 들었습니다!!
  3. 현재, deserializeUser까지는 잘 들어가고 welcome으로 넘어가는 중입니다.
    근데 welcome이 실행될 때 들어가는 값이 없어서
    페이지에서 전송한 데이터가 없다고 뜹니다.

    fileStore를 주석처리하였고
    successDirect또한 주석처리하고 savesession으로 변경하였습니다.

    왜 데이터를 전송하지 못하는 것일까요?

    console.log('Serial' + user)를 할경우
    user의 내용은 나오지 않고 object : Object로 출력되고 있는 게 문제인가요?


    +
    Submit버튼을 누르면
    deserializeUser가 두번이 실행됩니다

    +
    Error: Can't set headers after they are sent


    해결) 죄송합니다. res.send를 2번했습니다.
  4. Hyunwoo Jung
    /*------------- 필독 -------------*/

    현재 수업 코드 그대로 진행하면 심각한 오류가 있을 수 있습니다.
    만약, logout()까지(혹은 그 전에도) 수업을 듣고, 프로그램을 실행했을 때,
    " there is no user "라는 메세지가 안떠야하는데 계속해서 뜨고,
    분명 하라는대로 했는데도 프로그램이 정상적으로 작동하지 않는다면,

    app.use(
    session({
    ....
    store: new FileStore() --------> 이 부분을 주석처리해서 없에보세요!
    })
    );

    그러면 귀신같이 프로그램이 아무 문제 없이 작동합니다.

    /*------------- 필독 -------------*/
  5. madnomad
    easy~ easy~
  6. 박인호
    아래 내려보니 15년만의코딩 님이 답변해주신 내용에 해결책이 있었네요.
    app.post()의 마지막 인자로 콜백함수를 줘서 세션에 저장이 완료되면 /welcome 페이지로 이동하게 할 수 있었네요.
    ex)
    app.post('/auth/login', passport.authenticate('local', { //successRedirect: '/welcome',
    failureRedirect: '/auth/login',
    failureFlash: false }),
    function(req, res){
    req.session.save(function(){
    res.redirect('/welcome');
    })
    }
    );

    전에 이고잉님이 미들웨어는 app.post()의 중간 인자로 선택적으로 넣을 수 있다고 하셨던 말이 기억나네요.
    15년만의코딩님 감사합니다 ㅎㅎ
    대화보기
    • 박인호
      1-20
      수강완료.
      한 가지 궁금한 점이 있습니다. logout을 할 때나 register를 할 때는 session에 save가 완료되면 redirect 하도록 장성하는 코드를 추가 할 수 있는데 로그인이 완료되었을때는 해당 코드를 추가 할 수 없는것인가요?
      로그인을 하면 serialize가 한 번 실행되고 세션에 값이 저장되고 이후에 리다이렉트가 되는데 (passport.authenticate 이들 웨어를 통해) 이 사이에서 세션에 저장이 완료되면 리다이렉트 하는 코드를 추가 하고 싶습니다.
      로그인을 몇 번 실행해 본 결과, 세션은 저장되었지만, welcome페이지에서 로그인 안 된 화면을 출력하는 경우가 가끔 생기네요.
      이에 대해 해결책을 알고계신 고수님이 계시다면 답변 부탁드릴게요 ㅜㅜ
    • Je-Hyeong Kim
      deserializeUser가 실행이 안 되는 분은 참고해 보세요.

      로그인 후에 '/welcome' 페이지에
      displayName이 출력 되지 않는 것은
      세션 값이 저장 되지 않았기 때문입니다.

      해결법) 상단에 app.use 순서를 바꿔 보세요.
      sesssion 셋팅 후에 패스포트 세션 메소드를 써야합니다.

      app.use(session({
      secret: 'atc54321',
      resave: false,
      saveUninitialized: true,
      store: new FileStore()
      }));
      app.use(passport.initialize());
      app.use(passport.session());

      두 번째 동영상 말미에
      이고잉 님도 이 부분을 언급하셨습니다. ^^
    • bassplayerlee
      안녕하세요.

      강의 따라서 실습을 하다 보면 서버를 돌리는 콘솔 화면에 아래와 같은 오류 메세지가 계속 뜹니다.

      Error: EPERM: operation not permitted, rename 'C:\Users\Gunho\coding\opentuto\ja
      vascript_server_mysql\sessions\pPFRu-5r3NnrYhTBJ-hnWbAqZ1yFAANB.json.2603875785'
      -> 'C:\Users\Gunho\coding\opentuto\javascript_server_mysql\sessions\pPFRu-5r3Nn
      rYhTBJ-hnWbAqZ1yFAANB.json'
      at Error (native)

      웹 페이지 상에서는 문제없이 작동하긴 합니다. 그런데 저 오류는 무슨 뜻인가요?
    • 에휴
      해결했어요.!

      미들웨어쪽 에러였네요 ㅠㅠㅎ
    • 에휴
      deserializeUser 이부분이 먹통입니다.

      store: new FileStore()지워도 먹통이구요.

      passport.authenticate 이부분도 수정했는데 먹통입니다.
    • 준맹
      저도 초짜인데, 대문자로 시작하는 변수는 Prototype 객체(?) 로 알고있는데,
      사용할 때 new를 붙여서 새로운 객체를 생성해서 사용하는 것으로 알고 있어요.

      JS 프로토타입 객체 한 번 검색해보세요
      대화보기
      • MiJey
        로그인, 로그아웃이 잘 안될 때
        mir님이 달아주신 페이스북 링크 요약: store: new FileStore() 지우면 잘 동작한다
      • hyperhand
        route 강좌에서 이해 안되는 문법적인 부분이 있는데요,

        var LocalStrategy = require('passport-local').Strategy;
        .
        .
        new LocalStrategy(...);

        위 부분에서 LocalStrategy는 변수 아닌가요? 변수에 new가 붙을 수 있다는 게 이해가 안되네요.
        JS 초짜라서리ㅠㅠ
      • 요거 작동 안한답니다 링크 확인해 주세요
        https://www.facebook.com......063
      • 15년만에코딩
        analogsoul91님
        로그인폼에서 포스트로 처리해주는 부분을 아래처럼 수정해보시면 어떨까요?
        저도 이것때문에 고생좀 하고... 앞으로 돌아가서 세션부분 다시 듣고도 해결을 못하고
        결국 감자폭풍님 답글로 알게 되었습니다.
        로컬전략, 페이스북 전략 각각 올립니다.

        app.post(
        '/auth/login',
        passport.authenticate(
        'local',
        {
        //successRedirect: '/welcome',세션저장전에 URL이동을 막기위해 주석처리
        failureRedirect: '/auth/login',
        failureFlash: false
        }
        ),
        function(req, res) { // req, res객체를 불러서 session을 save를 확인한다음에 URL이동시킴
        req.session.save(function(){
        console.log('로긴 성공후 req, res호출');
        res.redirect('/welcome');
        })
        }
        );

        app.get('/auth/facebook/callback',
        passport.authenticate('facebook', { failureRedirect: '/auth/login' }),
        function(req, res) {
        //세션 세이브를 확인한 후에 결과 페이지로 넘어감
        req.session.save(function(){
        console.log('facebook세션 저장확인 완료');
        res.redirect('/welcome');
        });
        });
        대화보기
        • halo
          passport.use(new LocalStrategy(
          function(username, password, done){
          var uname = username;
          var pwd = password;
          for(var i=0; i<users.length; i++) {
          var user = users[i];
          if (uname === user.username && pwd === user.password) {
          console.log('LocalStrategy', user);
          return done(null, user);
          } else{
          return done(null, false);
          }
          }
          return done(null, false);
          }
          ));

          저는 done앞에 return을 붙여서 해결 했습니다.
        • 1234
          일단은 로컬 로그인만 보니까 뭔가 괜히 쓸데없이 복잡해보여 ㄷㄷ...
        • 새아
          이 부분 필요하네요!!!
          대화보기
          • kkongmn1193
            우선 저와같은 문제를 해결하기 위해선 deserlizer에 대해서 약간의 이해가 필요했습니다.

            welcome 페이지에 이동할때도 호출되더군요 그냥 어디서나 호출되는 세션같은 부분이었습니다.

            if(user.username ===id){
            return done(null,user)
            }
            저는 이부분에 혹시 아이디가 아니라면... 이라는 생각에

            else{ return done(null,falae)를 넣어줬는데 이거 때문에 안되던것 이었슴다.
          • kkongmn1193
            희안하네요... 분명 session의 위치도 passport의 session 선언보다 위에 있고 한대... login을 하고 나면 req.user의 정보가 welcome 에 날아가지를 않네요,.....
          • analogsoul91
            안녕하세요! 아직 한참 부족한 프로그래머입니다.

            강의를 듣다가 꼬이는 부분이 생겨서 글을 적게 되었습니다. 5번을 반복해서 보고 flow는 알게 되었지만 동작이 안됩니다.

            LocalStrategy() -> serializeUser() 를 거쳐 deserializeUser()의 console.log()가 출력이 되어야 하는데

            deserializeUser()에서 console.log()가 출력이 되지 않습니다.
            한참 삽질을 하다가 여기로 와보니 감자폭풍님께서 이미 같은 현상을 경험하셨고
            그에 대한 방안을 올려주셨지만 passport를 사용하지 않는 것 같아 질문을 올리게 되었습니다.

            감자폭풍님과 같은 현상으로 serializeUser를 거친 후 session 값을 저장하는 파일에 passport : ... 에서 ...에 Username이 저장 되어야 하지만 계속 저장이 되지 않습니다.

            Error: EPERM: operation not permitted, rename 이라는 에러로 session 파일이 로그인을 하거나 로그아웃을 할 때마다 새로운 파일명으로 저장이 되는데 이러한 과정에서 session 파일에 passport : ...이 저장 되지 않는 것 같습니다.

            혹시 해결 방법을 알고 계신 선배님 또는 고수님이 있으시다면 답글 부탁드립니다.
          • TravelDreammer님 제 개인적인 의견입니다만,
            강의에서 passport.use(new LocalStrategy()) 함수는
            app.post('/auth/login',
            passport.authenticate('local', {
            이 부분에서 passport.authenticate라는 함수에 의하여 호출되는 콜백 함수라고 기억하고 있습니다.
            따라서 회원가입하자마자 /welcome 페이지로 redirect되는 경우에는 app.post('/auth/login', ~) 의 route를 거치지 않기 때문에 LocalStrategy 가 호출되지 않는 것 같습니다.
            대화보기
            • TravelDreammer
              logout를 구현할때요~
              req.logout()을 쓰시면서 세션의 정보를 지워준다고 하는데
              현재 이 코드에서 로그아웃을 하면 새로 로그인한 회원정보는 유지 되지 않고 지워지는 것인가요??
              새로 가입한 정보로 로그인을 하면 log에 LocalStrategy도 찍히지 않고 로그인이 되지 않더라구요
              근데 register를 통해서 가입하면 로근인은 되구요! 무슨 문제일까요?
            • 질문있습니당!
              제가 여러번 로그인/로그아웃을 실행시키면서 찾아낸 문제점인데
              한 아이디로 로그인했다가 로그아웃하고 다시 다른 아이디로 로그인하면
              welcome 메시지만 출력될 뿐 제대로 로그인이 안 되네요. (다시 한 번 더 로그인을 시도하면 되긴 하지만)
            • buster
              와 감사합니다 ㅠㅠ
              대화보기
              • rtgse
                고맙습니다^^ 덕분에 문제를 해결했네요.
                그런데 궁금한게 egoing님은 그러한 처리단을 만드시지 않으신 것 같은데, 정상적으로 동작하는 이유도 아시나요?
                대화보기
                • Boswell
                  좋은 강의 만들어주셔서 고맙습니다.
                • 이제한달
                  저도 로그아웃이 안 되는 현상이 있었는데 github 에서 코드 보면서 라우터 위치를 바꿔주니까 제대로 동작하네요
                • djsroom
                  감사해요.
                  저도 한참을 고민하다가 댓글보고 해결했네요.
                  대화보기
                  • 으허
                    호동님. github에서 egoing님을 찾으면 소스 확인하실 수 있습니다.
                  • 호동
                    강의를 들으며 따라 하는데요. 일단 코드를 적고 실행해 보는데 로그인 과정에서 로그인 이후 로그아웃 화면이 출력되지 않는데 어디가 문제인지 모르겠어서 본 과정의 소스와 비교해 보려고 하는데 소스가 따로 없어 비교해 볼 수 가 없네요. 본 과정의 소스를 공유해주시면 감사하겠습니다.
                  • 초초초초보
                    for(var i=0; i<users.length; i++){
                    var xx = users[i];
                    console.log(users[i].username);
                    if(xx.username === id) {
                    console.log('aaa');
                    return done(null, xx);
                    }
                    }
                    return done(null, false);
                  • 초초초초보
                    미쳐미쳐님..
                    일단, 계속 돌아가는 부분은.. deserializeUser 의 마지막 부분. for 문 후에.. return done(null, false); 이런식으로 return 값을 주니깐 해결이 되던데요..
                    대화보기
                    • 미쳐미쳐
                      마지막 Register해서 아이디 맘대루 해서 등록 하고 나니까 실행 할때마다
                      3003 connected!!
                      Deserialize 12adf(제가 등록한 아이디)
                      만 계속 나오고 웹페이지 접속이 안되네요.. 계속 로딩만...
                      후.. 뭐가 문젠지 모르겠네요 ㅠㅠ
                    • Hello World
                      세번 다시 보니까 이해되네요

                      passport.serializeUser는 처음 client가 web page에 접속 하여 로그인을 하는 경우 session에 값을 등록해주는

                      기능을 가지고 있습니다. 인자로 전달받은 user 객체의 정보를 이용하여 done의 두번쨰 인자로 user.username

                      을 session에 값으로 등록해주는 과정입니다. client가 다른 페이지나 현재 페이지를 reload 하는 경우

                      passport.deserializeUser는 인자로 전달받은 user.username 즉, 현재 session에 등록된 값을 이용하여

                      기존에 저장된 데이터와 일치하는 정보를 찾은 후 done의 두번째 인자로 user의 정보를 담은 객체인 user를

                      전달합니다.


                      휴...nodejs 강의 들으면서 제일 어려웠던 부분이네요ㅠㅠ
                    • 디미몬
                      댓글 못 보고 저도 한참 헤매고 있었네요 ㅠㅠ

                      유용한 정보 감사드립니다 !!
                      대화보기
                      • 감자폭풍
                        강의듣고 따라하던 도중에 하루 넘게 삽질을 한 사항이 있어서 공유할까 합니다.

                        이슈사항
                        deserializeUser 가 호출이 되지 않는 현상이 발생

                        원인
                        loging을 하였는데 Session안에 passport객체가 존재하지 않음.
                        확인결과 session정보에 passport 객체가 저장되어 있지 않으면 deserializeUser는 호출되지 않음.

                        해결방안
                        passport.authenticate( 'local', {
                        //successRedirect: '/welcome', // 해당 코드를 주석으로 처리하면 아래의 fuction이 호출됨
                        failureRedirect: '/auth/login', failureFlash: false }
                        ),
                        function(req, res) { // 해당 function이 호출되고 나서 session을 save해주는 로직을 해주고 처리함.
                        req.session.save(function(){
                        res.redirect('/welcome');
                        });
                        }

                        좋은 하루되세요~~
                      • egoing
                        죄송합니다 ㅠㅠ
                        대화보기
                        • 한아
                          정말 어렵군요 ㅠㅠ
                        • egoing
                          아이고 저 같은 못난이 강사에 대해서 이렇게 후하게 평가해주셔서 너무 감사합니다. 지금은 타사 인증 강의 만들다가 잠시 쉬고 있었는데 힘나는 글이 눈 앞에 따악! 이래서 멈출수가 없어요 ㅎㅎ
                          대화보기
                          • Marmot
                            매번 너무 감사드립니다 ^^

                            잘하는 사람의 맹점은 못하는 사람이 무엇을 모르는지 모르는 것 아닐까 싶습니다

                            때문에 못하는 사람의 입장을 고려하지 않은 난해한 설명만 잔뜩 접하다보니

                            마치 어지러운 바둑판을 초심자가 보는 것 같은 아득함만 있었는데


                            모르는 사람이 뭘 모르는지 정확히 아시고 하나하나 짚어주시는 분을 뵈니

                            이렇게 고마울 수가 없네요..

                            더군다가 쉽게 알려주시는 분도 많은 경우 아예 모른다고 가정하고

                            지나치게 기초적인 것만 알려주다보니 직접 그걸 가지고 뭘 할수가 없었는데

                            차근차근 단계를 밟아 실제 뭘 만들 수 있게끔까지 해 주시니..


                            속이 다 후련해 지는게 요즘 절이라도 드리고 싶습니다 ㅠㅠ