• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 마이페이지 로그인 실패 이슈

마이페이지 로그인 실패 이슈

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 글쓴이
  • #49784

    프엔스터디
    참가자
    안녕하십니까 덕분에 늘 실력향상을 하고 꿈을 (아직) 잃지 않은 현 컴공 졸업반이자 프론트 취준생입니다..
    마이페이지에서 미들웨어가 제대로 동작하지 않는 것 같아 질문을 드립니다.
     
    
    로그인은 가능하고, 쿠키도 정상적으로 생성이 됩니다.
    하지만 늘 '로그인이 되지 않았다'고 else로 이동을 합니다.
    시험삼아 if else문의 조건을 서로 바꿔
    else에 next를 넣어보니 마이페이지로 잘 이동하는 것으로 보아, DB 시리얼라이즈 관련해선 문제가 없다고 생각이 됩니다
    
    관련 코드 첨부 하겠습니다.
    
    [server.js]
    
    // 로그인하기
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const session = require('express-session');
    // 미들웨어 : 요청-응답 중간에 뭔가 실행되는 코드, app.use나 post의 두번째인자
    app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
    app.use(passport.initialize());
    app.use(passport.session());
    app.get('/login', function(req, res) {
        res.render('login.ejs')
    })
    app.post('/login', passport.authenticate('local', {
        failureRedirect : '/fail'
    }),function(req, res) {
        res.redirect('/')
    })
    // 위 post 동작에서 실행한 passport 덕분에 실행되는 코드
    passport.use(new LocalStrategy({
        // 우리가 폼에다가 작성한 name들 
        usernameField: 'id',
        passwordField: 'pw',
        // session 정보를 저장할 것이느냐
        session: true,
        // 아이디, 비밀번호 말고도 다른 정보 검증시 사용
        // 아래 콜백함수에 인자 한 개(req) 더 넣고 검사 req.body를 통해 검사
        passReqToCallback: false,
    }, function (입력한아이디, 입력한비번, done) {
            //console.log(입력한아이디, 입력한비번);
            //1. DB에서 데이터 찾고
            db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
            //에러처리
            if (에러) return done(에러)
            
            // 2. 입력한 아이디 자체가 없으면 실행할 코드
            // done( 서버에러, 성공시 사용자 DB 데이터, { 에러메세지 } )
            if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
            // 3. DB에 ID가 있으면 비번 검사
            if (입력한비번 == 결과.pw) {
                return done(null, 결과)
            } else {
                return done(null, false, { message: '비번틀렸어요' })
            }
        })
    }));
    // 로그인 성공 -> 세션정보 생성 -> 마이페이지 방문시 세션검사
    // id를 이용해서 세션을 저장시키는 코드 'user엔 로그인의 결과가 쏙 들어감'
    passport.serializeUser(function(user, done) {
        // user.id에 세션이 만들어짐
        // 세션 데이터를 만들고 세션의 id 정보를 쿠키로 보냄
        done(null, user.id)
    });
    // 이 세션 데이터를 가진 사용자를 찾을 때 즉, 마이페이지 이용시 사용
    // 로그인한 유저의 세션아이디를 바탕으로 개인정보를 DB에서 찾는 역할
    passport.deserializeUser(function(아이디, done) {
        db.collection('login').findOne( { id : 아이디 }, function(에러, 결과) {
            done(null, 결과)
            // 여기서 결과엔 { id : 입력한 id, pw : 입력한 pw, 이름 : 이름 } 등 내가 넣은 정보들이 저장
            // 결과에 담긴 데이터들은 app.get('/mypage')에서 요청.user (req.user) 에 담겨있음   
        })
    })
    
    
    
    
    #49811

    codingapple
    키 마스터
    app.get app.post 이런걸 더 밑으로 내려봅시다
    #49896

    프엔스터디
    참가자
    헉.. 잘 됩니다.. 감사합니다. 이런 것도 스스로 캐치하지 못한 점에 스스로 깊은 반성을 합니다.
    혹시 로그인했니 같은 미들웨어가 시리얼라이즈 아래에 있어야 하는 설명을 듣고 싶은데 혹시 짤막하게 나마 
    질문을 드려도 괜찮을까요?
     
    #49918

    codingapple
    키 마스터
    뭐든 정의부분은 위에 작성해야 밑에서 잘 사용됩니다
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠