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

home2 게시판 Node.js, Express 게시판 passport deserializeUser 함수가 실행이 안됩니다..

passport deserializeUser 함수가 실행이 안됩니다..

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

    전재욱
    참가자
    프론트는 리액트로 하는중이라 백엔드는 라우터들만 만들었습니다. 
    
    // app.js
    
    const express = require('express');
    const mongoose = require('mongoose');
    require('dotenv').config();
    const cors = require('cors');
    const { S3Client, DeleteObjectCommand } = require('@aws-sdk/client-s3')
    const multer = require('multer')
    const multerS3 = require('multer-s3')
    const authRouter = require('./src/routes/auth');
    const session = require('express-session');
    const passport = require('passport');
    const passportConfig = require('./src/passport');
    const MongoStore = require('connect-mongo');
    const app = express();
    passportConfig();
    const config = {
    PORT: process.env.PORT,
    DB_URL: process.env.DB_URL,
    bucketName: process.env.BUCKET_NAME,
    region: process.env.REGION,
    accessKey: process.env.ACCESS_KEY,
    secretKey: process.env.SECRET_KEY,
    passport_secret: process.env.COOKIE_SECRET
    }
    mongoose.connect(config.DB_URL, {
    dbName: 'ReviewMoa'
    });
    mongoose.connection.on('connected', () => console.log('정상적으로 MongoDB에 연결되었습니다.'));
    const corsOptions = {
    origin: 'http://localhost:3000',
    optionSucessStatus: 200,
    credentials: true
    }
    app.use(cors(corsOptions));
    app.use(express.json());
    app.use(express.urlencoded({ extended: true }));
    app.use(session({
    secret: config.passport_secret,
    resave : false,
    saveUninitialized : false,
    cookie: { maxAge: 60 * 60 * 1000, httpOnly: false, secure: false },
    store: MongoStore.create({
    mongoUrl: config.DB_URL,
    dbName: 'ReviewMoa'
     })
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use('/auth', authRouter);
    
    // auth.js
    
    const { Router } = require('express');
    const { User } = require('../db/models');
    const bcrypt = require('bcrypt');
    const passport = require('passport');
    const router = Router();
    router.post('/login', (req, res, next) => {
    passport.authenticate('local', (authError, user, info) => {
    if (authError) {
    console.log(authError);
    return next(authError);
     }
    if (!user) {
    return res.status(200).json({ message: info.message });
     }
    req.login(user, (loginError) => {
    if (loginError) {
    console.error(loginError);
    return next(loginError);
     }
    console.log('Session after login:', req.session);
    res.status(200).json({ message: 'success' });
     })
     })(req, res, next);
    });
    
    // passport/localStrategy.js
    
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const bcrypt = require('bcrypt');
    const { User } = require('../db/models');
    module.exports = () => {
    passport.use(
    new LocalStrategy(
     {
    session: true,
    usernameField: 'email',
    passwordField: 'password'
     },
    async (email, password, done) => {
    try {
    const user = await User.findOne({ email });
    if (user) {
    const result = await bcrypt.compare(password, user.password);
    if (result) {
    done(null, user);
     } else {
    done(null, false, { message: "비밀번호가 일치하지 않습니다" });
     }
     } else {
    done(null, false, { message: "가입되지 않은 회원입니다" });
     }
     } catch (error) {
    console.log(error);
    done(error);
     }
     }
     ))
    }
    
    // passport/index.js
    
    const passport = require("passport");
    const { User } = require("../db/models");
    const local = require("./localStrategy");
    const { ObjectId } = require("mongodb");
    module.exports = () => {
    local();
     
    passport.serializeUser((user, done) => {
    console.log('serial', user._id);
    done(null, user._id);
     });
     
    passport.deserializeUser(async (id, done) => {
    try {
    let user = await User.findOne({ _id: new ObjectId(id) });
    console.log('deserial', user);
    delete user.password;
    done(null, user);
     } catch (error) {
    done(error);
     }
     });
    }
    
    이렇게 해둔 상태인데 로그인을 하면 로그인은 됩니다. 근데 백엔드 콘솔에 serializeUser 의 console.log('serial', user._id); 와 /login 라우터의 끝부분에
    있는 console.log('Session after login:', req.session); 만 실행이 됩니다. deserializeUser 의 console.log('deserial', user); 는 출력이 안되고 다른
    라우터에서 req.user 찍어보면 undefined 가 나오는걸 보니 deserializeUser 함수는 실행이 안되는 거 같아요. 선생님 강의처럼 그냥 한 파일에 패스포트
    코드들 강의에서랑 순서 똑같이 해봐도 똑같구요. 구글에 deserializeUser 함수 실행 안되는 경우들 찾아봤는데 저는 그 어떠한 경우에도 부합하지 않는데
    안됩니다 ㅠㅠㅠ 뭐가 문제일까요 도와주세요 이거때문에 하루종일 붙잡고 있었는데 피가 꺼꾸로 솟습니다
    로그인은 되고 db의 sessions 컬렉션에도 
    스크린샷 2023-11-15 오전 2.52.09
    이렇게 잘 생깁니다. session 의 뒷내용이 짤렸는데 나머지 쿠키 옵션이랑 passport: { user: new ObjectId('65537ad1ebd829a8c1b153e1') } 도 있습니다.
    도대체 왜 deserializeUser 실행이 안되는 걸까요 ㅜㅠ 도와주십셔..
    
    
    #103992

    codingapple
    키 마스터
    index.js 내용 첨부하는 위치를 이리저리 바꿔봅시다 
    아니면 ajax요청으로 하는거면 쿠키도 잘보내고 있나 확인합시다
    #104030

    전재욱
    참가자
    위치 이리저리 바꿔봐도 똑같네요.. 쿠키도 로그인 후에 브라우저 쿠키 보면 connect.sid 라는 애가 잘 있습니다. 프론트에서는 ajax 요청 시 withCredentials
    도 true 로 줬구요
    스크린샷 2023-11-15 오후 4.33.56
    이쯤 되니 이게 사실은 제대로 되고있는게 아닐까 하는 생각도 드네요. 로그인 하면 serializeUser 실행되고 deserializeUser도 실행된 다음에 req.login 쪽
    실행되는게 맞는거죠?
    스크린샷 2023-11-15 오후 4.41.31
    이 상태면 로그인을 하면 콘솔창에 serializeUser: 어쩌구 찍힌 다음에 1 이랑 deserial 어쩌구 가 찍혀야 되는게 맞는거죠? 제가 헛물켜고 있는건 아니죠..?
    뭔짓거리를 해도 deserializeUser 는 아예 실행이 안되네요 ㅜ
    근데 deserializeUser는 실행조차 안되는거같은데 req.login 의 콜백함수의 console.log('Session after login:', req.session); 해보면 이건 
    스크린샷 2023-11-15 오후 4.45.47
    이렇게 잘 나옵니다..
    #104045

    codingapple
    키 마스터
    그럼 로그인은 잘 된걸수도요 다른 ajax요청날릴 때 서버에서 요청.user 나오나 출력해봅시다 
    passportConfig(); 도 수상한데 app.use 밑으로 내려봅시다
    
    #104046

    전재욱
    참가자
    passportConfig() 를 어디에 위치시켜도 똑같네요..
    
    스크린샷 2023-11-15 오후 7.32.06
    로그인 후에 여기로 ajax 요청 보내면 req.user가 undefined로 나옵니다
    #104101

    codingapple
    키 마스터
    저도 ajax로 요청하면 쿠키생성이 안되네요 확인해보겠습니다
    #104122

    codingapple
    키 마스터
    localhost부분을 127.0.0.1로 다 바꿔서 ajax요청하면 되는듯요
    #104215

    전재욱
    참가자
    그렇게 해도 안되네요. 전 쿠키는 생성이 되는데 deserializeUser 함수가 실행이 안되고 그래서 다른 라우터에서 req.user를 접근하면 undefined가 나오는
    상황이라 흠..
    하여튼 뭘 해도 안되가지고 더 암걸리기 전에 포기하고 일단은 jwt로 로그인 구현 했습니다. 여러번 질문했는데 봐주셔서 감사합니다 스앵님
8 글 보임 - 1 에서 8 까지 (총 8 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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