• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

로그인 실패 에러 (500 Internal Server Error)

23.11.14 21:04 작성 23.11.14 21:12 수정 조회수 307

0

회원가입 시 MySQL 테이블에 이메일, 비밀번호 저장되는 것을 확인하고 로그인을 시도했는데 계속 실패해서 질문드립니다

 

스크린샷 2023-11-14 153326.pngMySQL 워크벤치로 확인한 user 테이블을 보면 회원가입은 잘 되었는데 id: 2 의 메일, 비밀번호로 로그인이 안 됩니다

 

console.log로 확인해보니까 패스포트 로그인 시도에서 에러가 나는 것 같기는 한데 정확한 원인을 못 찾겠습니다..

 

터미널에 뜨는 메시지입니다

스크린샷 2023-11-14 184711.png

개발자도구_네트워크 화면입니다

스크린샷 2023-11-14 184807.png스크린샷 2023-11-14 185042.png

개발자도구_콘솔 화면입니다

스크린샷 2023-11-14 185334.png

 

의심스러운 코드입니다!

routes/user.js 코드

const express = require('express');
const bcrypt = require('bcrypt');
const passport = require('passport');

const { User } = require('../models');

const router = express.Router();

router.post('/login', (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
        if (err) { //서버쪽 에러
            console.error(err);
            console.log('routes/user_server err')
            return next(err);
        }
        if (info) { //클라이언트쪽 에러
            return res.status(401).send(info.reason); 
        }
        return req.login(user, async (loginErr) => {
            if (loginErr) { //패스포트 로그인 에러
                console.error(loginErr);
                console.log('routes/user_loginErr')
                return next(loginErr);
            }
            // res.setHeader('Cookie', 'cxlhy..랜덤토큰')
            return res.status(200).json(user);
        });
    })(req, res, next);
});

router.post('/', async (req, res, next) => { // POST /user
    try {
        const exUser = await User.findOne({
            where: {
                email: req.body.email,
            }
        });
        if (exUser) {
            return res.status(403).send('이미 가입된 메일입니다.');
        }
        const hashedPassword = await bcrypt.hash(req.body.password, 10); //10~13
        await User.create({
            email: req.body.email,
            nickname: req.body.nickname,
            password: hashedPassword,
        });
        res.status(201).send('OK');
    } catch (error) {
        console.error(error);
        next(error); //next로 에러 처리 (한방에), status 500
    }
});


module.exports = router;

 

app.js 코드

const express = require('express');
const cors = require('cors');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const passport = require('passport');
const dotenv = require('dotenv');

const postRouter = require('./routes/post');
const userRouter = require('./routes/user');
const db = require('./models');
const passportConfig = require('./passport');

dotenv.config();

const app = express();
db.sequelize.sync()
    .then(() => {
        console.log('db 연결 성공');
    })
    .catch(console.error);

passportConfig();

app.use(cors({
    origin: 'http://localhost:3000',
    credentials: false,
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    saveUninitialized: false,
    resave: false,
    secret: process.env.COOKIE_SECRET,
}));
app.use(passport.initialize());
app.use(passport.session());

~이하생략~

 

passport/index.js 코드

const passport = require('passport');
const local = require('./local');
const { User } = require('../models');

module.exports = () => {
    passport.serializeUser((user, done) => {
        done(null, user.id);
    });

    passport.deserializeUser(async (id, done) => {
        try {
            const user = await User.findOne({ where: { id } });
            done(null, user); //req.user
        } catch (error) {
            console.error(error);
            done(error);
        }
    });

    local();
};

 

passport/local.js 코드

const passport = require('passport');
const { Strategy: LocalStrategy } = require('passport-local');
const bcrypt = require('bcrypt');
const { User } = require('../models');

module.exports = () => {
    passport.use(new LocalStrategy({
        usernameField: 'email', //id칸
        passwordField: 'password', //비밀번호칸
    }, async (email, password, done) => { //done으로 결과 판단
        try {
            const user = await User.findOne({ //가입된 이메일이 있는지 검사
                where: { email }
            });
            if (!user) {
                return done(null, false, { reason: '존재하지 않는 이메일입니다.' });
            }
            const result = await bcrypt.compare(password, user.password)
            if (result) {
                return done(null, user);
            }
            return done(null, false, { reason: '비밀번호가 일치하지 않습니다.' });
        } catch (error) {
            console.error(error);
            return done(error);
        }
    }));
};

 

 

답변 1

답변을 작성해보세요.

0

오, req.login에서 에러나는 분은 제 강의 역사상 처음이십니다. 터미널에 2라고 찍히는데 저기가 어딘지 찾아보세요. serializeUser에서 user도 console.log 찍어보세요.

2는 user테이블의 id같은데 왜 나온건지 모르겠습니다..

serializeUser에서 console.log(user); 입력하고 다시 로그인하니까 터미널에 이렇게 떴습니다!

 

image

console.log('id', user.id) 하면 id 2가 제대로 뜨는거죠? 이 값이 done(null, user.id)로 들어가면 req.login에서는 성공 처리가 되어야 하는데 희한하네요.

갑자기 딱히 건드린 게 없는데 똑같은 이메일 비번으로 로그인했을 때 log_in_success가 뜨고

다른 에러가 발생하는데 왜 그런걸까요?? 수정한 게 없고 다음날 똑같이 다시 실행한것뿐인데 결과가 달라서 당황스럽습니다 ㅠㅠ

 

image원래 log_in_failure가 떴었는데 지금은 log_in_success가 뜹니다..

그니까 원래 성공해야 했던 코드인데 에러가 떠서 제가 당황스러웠습니다...

지금 에러만 해결하시면 됩니다.