Server Side JavaScript

Passportjs

Passport Introduction(패스포트 소개)

 Configuration(설정)

Route

Serialize

logout(로그아웃)

review ( 복습) 

댓글

댓글 본문
작성자
비밀번호
  1. 요거 작동 안한답니다 링크 확인해 주세요
    https://www.facebook.com......063
  2. 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');
    });
    });
    대화보기
    • 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을 붙여서 해결 했습니다.
    • 일단은 로컬 로그인만 보니까 뭔가 괜히 쓸데없이 복잡해보여 ㄷㄷ...
    • 새아
      이 부분 필요하네요!!!
      대화보기
      • 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
          와 감사합니다 ㅠㅠ
          대화보기
          • 고맙습니다^^ 덕분에 문제를 해결했네요.
            그런데 궁금한게 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
                        매번 너무 감사드립니다 ^^

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

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

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


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

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

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

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

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


                        속이 다 후련해 지는게 요즘 절이라도 드리고 싶습니다 ㅠㅠ
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기