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

home2 게시판 Node.js, Express 게시판 (회원인증기능 2) 로그인이 되지 않습니다.

(회원인증기능 2) 로그인이 되지 않습니다.

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

    앤디
    참가자
    안녕하세요.
    (회원인증기능 2) 강의 따라하고 있는데 로그인이 안되서 질문드립니다.
    이것 때문에 몇일 혼자 해결해보려다가 왜 안되는지 도저히 몰라서 질문 드리는데 꼭 답변 부탁드립니다..!
    로그인 하기위해 강의와 같은 코드를 넣었는데 강의와 다르게 세션(쿠키)이 생성되지 않고 Cannot GET /fail가 나오면서 홈으로 redirect 되지 않습니다. 
    login.ejs에서 로그인을 하기위해 form의 input에 데이터를 입력해 post요청을 하게되면 Cannot GET /fail가 나옵니다.
    mongodb에서 컬렉션도 만들고 id와 pw의 데이터도 생성했고 같은 데이터를 form에 넣었는데 왜 로그인이 안되는지 모르겠습니다.
    강의의 코드는 local방식으로 authenticate 실패했을때 /fail로 이동하게 되어있는데 왜 로그인이 안되는지 모르겠네요.
    
    아래는 저의 server.js와 login.ejs코드 입니다.
    
    server.js
    
    const express = require('express');
    const path = require('path');
    const app = express();
    // ejs 사용을 위한 코드
    app.set('view engine', 'ejs');
    // DB 연결 시키는 코드
    var db;
    const MongoClient = require('mongodb').MongoClient
    MongoClient.connect('mongodb+srv://dgnam:@cluster0.jrf8jrq.mongodb.net/ProjectA?retryWrites=true&w=majority', function(에러, client){
    if (에러) return console.log(에러)
    db = client.db('ProjectA');
    // db.collection('login').insertOne({id:'test222', pw : 'test22'}, () => {
    // console.log('저장완료');
    // }
    // )
    app.listen(8080, function() {
    console.log('listening on 8080 :)')
     })
    })
     
     
     
    app.get('/', function(요청, 응답) {
    응답.render('index.ejs');
    });
     
     
     
    // 로그인에 필요한 라이브러리 호출
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const session = require('express-session');
    app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
    app.use(passport.initialize());
    app.use(passport.session());
     
    app.get('/login', function(요청, 응답) {
    응답.render('login.ejs');
    });
    // app.post('/login', function(요청, 응답){
    // 응답.redirect('/')
    // console.log('haha');
    // });
    // 1. 아이디 비번 인증도와주는 코드
    app.post('/login', passport.authenticate('local', {failureRedirect : '/fail'}), function(요청, 응답){
    응답.redirect('/');
    console.log('authenticate 성공');
    });
     
    /*
    어떻게 인증할건지 세부 코드
    LocalStrategy(): 이게 여러분 local 방식으로 아이디/비번 검사를 어떻게 할지 도와주는 부분
    */
    passport.use(new LocalStrategy({
    usernameField: 'id',
    passwordField: 'pw',
    session: true,
    passReqToCallback: false,
     }, function (입력한아이디, 입력한비번, done) {
    //console.log(입력한아이디, 입력한비번);
    db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
    if (에러) return done(에러)
     
    if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
    if (입력한비번 == 결과.pw) {
    return done(null, 결과)
     } else {
    return done(null, false, { message: '비번틀렸어요' })
     }
     })
     }));
     
    /* 
    serializer
    : 입력한 아이디/비번이 db의 값과 맞다면 -> 세션 방식이 적용됨. 그래서 세션 데이터를 만들어줘야함.(라브가 함) 그리고 세션 데이터에 세션아이디를 발급해 유저에게 보내야함. (i.e. 쿠키로 만들어서 보내주면됨. )
    */
    passport.serializeUser(function (user, done) {
    console.log('serializeUser user ==', user)
    done(null, user.id)
     });
     
    passport.deserializeUser(function (아이디, done) {
    console.log('deserializeUser의 아이디 ==', 아이디)
    done(null, {})
     });
    
    
    login.ejs
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
    <title>Document</title>
    </head>
    <body>
     
    <%- include('nav.html') %>
    <h4 class="container mt-4">로그인 페이지</h4>
    <div class="container mt-4">
    <form action="/login" method="POST">
    <div class="form-group">
    <label>아이디</label>
    <input type="text" class="form-control" name="id">
    </div>
    <div class="form-group">
    <label>비번</label>
    <input type="text" class="form-control" name="pw">
    </div>
    <button type="submit" class="btn btn-danger">로그인</button>
    </form>
    </div>
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    </body>
    </html>
    
    
    
    
    #56327

    codingapple
    키 마스터
    .deserializeUser안에 아무것도 없는데 뭔가 더 넣어야합니다
    #56338

    앤디
    참가자
    (회원인증기능 2) 강의에서 세션의 쿠키가 생성될 때의 코드에선 deserializeUser에 특별히 뭔가 없었어서 
    일단 (회원인증기능 3)부분에서 사용하는 deserializeUser코드를 추가해보았는데도 동작하지 않습니다. (아래는 deserializeUser에 추가한 코드입니다)
    
    passport.deserializeUser(function (아이디, done) {
    db.collection('login').findOne({ id: 아이디 }, function (에러, 결과) {
    done(null, 결과)
     })
     });  
    
    
    여전히 Cannot GET /fail이 뜹니다..
    
    
    #56372

    codingapple
    키 마스터
    db에 저장된 아이디 비번이랑 똑같이 제출했는지 ejs파일에서 확인하거나 서버에서 출력해봅시다
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 호 / 개인정보관리자 : 박종흠