8 글 보임 - 1 에서 8 까지 (총 8 중에서)
-
글쓴이글
-
2023년 11월 15일 02:54 #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 컬렉션에도
이렇게 잘 생깁니다. session 의 뒷내용이 짤렸는데 나머지 쿠키 옵션이랑 passport: { user: new ObjectId('65537ad1ebd829a8c1b153e1') } 도 있습니다. 도대체 왜 deserializeUser 실행이 안되는 걸까요 ㅜㅠ 도와주십셔..
2023년 11월 15일 09:42 #103992
codingapple키 마스터index.js 내용 첨부하는 위치를 이리저리 바꿔봅시다 아니면 ajax요청으로 하는거면 쿠키도 잘보내고 있나 확인합시다
2023년 11월 15일 16:43 #104030
전재욱참가자위치 이리저리 바꿔봐도 똑같네요.. 쿠키도 로그인 후에 브라우저 쿠키 보면 connect.sid 라는 애가 잘 있습니다. 프론트에서는 ajax 요청 시 withCredentials 도 true 로 줬구요
이쯤 되니 이게 사실은 제대로 되고있는게 아닐까 하는 생각도 드네요. 로그인 하면 serializeUser 실행되고 deserializeUser도 실행된 다음에 req.login 쪽 실행되는게 맞는거죠?
이 상태면 로그인을 하면 콘솔창에 serializeUser: 어쩌구 찍힌 다음에 1 이랑 deserial 어쩌구 가 찍혀야 되는게 맞는거죠? 제가 헛물켜고 있는건 아니죠..? 뭔짓거리를 해도 deserializeUser 는 아예 실행이 안되네요 ㅜ 근데 deserializeUser는 실행조차 안되는거같은데 req.login 의 콜백함수의 console.log('Session after login:', req.session); 해보면 이건
이렇게 잘 나옵니다..
2023년 11월 15일 19:12 #104045
codingapple키 마스터그럼 로그인은 잘 된걸수도요 다른 ajax요청날릴 때 서버에서 요청.user 나오나 출력해봅시다 passportConfig(); 도 수상한데 app.use 밑으로 내려봅시다
-
글쓴이글
8 글 보임 - 1 에서 8 까지 (총 8 중에서)
- 답변은 로그인 후 가능합니다.