diff --git a/app.js b/app.js index 33ae4e8..49666a9 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,8 @@ const methodOverride = require("method-override"); const testRouter = require("./routes/testRouter"); const boardRouter = require("./routes/boardRouter"); const commentRouter = require("./routes/commentRouter"); +const indexRouter = require('./routes/index'); +const userRouter = require('./routes/user'); // view engine setup app.set("views", path.join(__dirname, "views")); @@ -35,6 +37,9 @@ app.use("/test", testRouter); app.use("/board", boardRouter); app.use("/comment", commentRouter); +app.use('/', indexRouter); +app.use('/user', userRouter); + // catch 404 and forward to error handler app.use(function (req, res, next) { next(createError(404)); diff --git a/controllers/indexcontroller.js b/controllers/indexcontroller.js new file mode 100644 index 0000000..32b0c5d --- /dev/null +++ b/controllers/indexcontroller.js @@ -0,0 +1,16 @@ +//main 함수 index.ejs 뷰를 렌더링하여 응답을 보내는 역할 +exports.main = (req, res) => { + res.render('index'); +}; +// 로그인 페이지를 보여주는 역할 +exports.login = (req, res) => { + res.render('login'); +}; +//회원가입하는 페이지를 보여주는 역할 +exports.signUp = (req, res) => { + res.render('signUp'); +}; +// 고객 정보 조회(사용자 프로필) 페이지를 보여주는 역할 +exports.profile = (req, res) => { + res.render('profile'); +}; \ No newline at end of file diff --git a/controllers/usercontroller.js b/controllers/usercontroller.js new file mode 100644 index 0000000..6e96f42 --- /dev/null +++ b/controllers/usercontroller.js @@ -0,0 +1,111 @@ +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const User = require('../model/quser'); // 쿼리 모델 +const secretKey = process.env.SECRET_KEY || 'your_secret_key'; + + + +// 회원가입 +exports.CsignUp = async (req, res) => { + console.log(req.body); + try { + const hashedPassword = await bcrypt.hash(req.body.pw, 10); + const userData = { ...req.body, pw: hashedPassword }; + const result = await User.MsignUp(userData); + console.log('signUp', result); + res.status(200).res.send("회원가입 성공"); + res.json({ result: true }); + } catch (error) { + res.status(500).json({ result: false, message: '회원가입 실패', error: error.message }); + } +}; + +// 로그인 +exports.Clogin = async (req, res) => { + console.log(req.body); + try { + const result = await User.Mlogin(req.body); + console.log('login', result); + if (result.length >= 1) { + const user = result[0]; + console.log('Stored hash:', user.user_pw); + console.log('Entered password:', req.body.pw); + const match = await bcrypt.compare(req.body.pw, user.user_pw); + console.log('Password match:', match); + if (match) { + const token = jwt.sign({ id: user.id, username: user.username }, secretKey, { expiresIn: '1h' }); + res.cookie(user.user_id, token, { httpOnly: true, secure: true }); + res.json({ result: true, message: '로그인 성공', token: token, data: { user_nickname: user.user_nickname, user_id: user.user_id } }); + } else { + res.json({ result: false, message: '비밀번호가 일치하지 않습니다.' }); + } + } else { + res.json({ result: false, message: '사용자를 찾을 수 없습니다.' }); + } + } catch (error) { + console.error('로그인 중 에러 발생:', error); + res.status(500).json({ result: false, message: '로그인 실패', error: error.message }); + } +}; + +// 회원정보 조회 +exports.Cinfo = async (req, res) => { + try { + const token = req.cookies.token; + console.log('Token:', token); + if (!token) { + return res.status(401).json({ result: false, message: '토큰이 없습니다.' }); + } + const decoded = jwt.verify(token, secretKey); + console.log('Decoded ID:', decoded.id); + + const result = await User.Minfo(decoded.id); + console.log('info', result); + if (result.length > 0) { + res.json({ result: true, info: result[0], message: '회원존재' }); + } else { + res.json({ result: false, info: null, message: '존재하지 않는 회원' }); + } + } catch (error) { + console.error('Error in Cinfo:', error); + res.status(401).json({ result: false, message: '인증 실패' }); + } +}; + +// 회원정보 수정 +exports.Cupdate = async (req, res) => { + try { + const token = req.cookies.token; + console.log('Token:', token); + if (!token) { + return res.status(401).json({ result: false, message: '토큰이 없습니다.' }); + } + const decoded = jwt.verify(token, secretKey); + console.log('Decoded ID:', decoded.id); + + console.log('Request Body:', req.body); + const hashedPassword = await bcrypt.hash(req.body.pw, 10); // 비밀번호 해싱 + console.log('Hashed Password:', hashedPassword); + + const updateData = { ...req.body, pw: hashedPassword, id: decoded.id,username:decoded.username }; + const result = await User.Mupdate(updateData); + console.log('Update Result:', result); + + res.json({ result: true }); + } catch (error) { + res.status(401).json({ result: false, message: '인증 실패' }); + } +}; + +// 회원정보 삭제 +exports.Cdelete = async (req, res) => { + try { + const token = req.cookies.token; + const decoded = jwt.verify(token, secretKey); + const result = await User.Mdelete(decoded.id); + console.log('delete', result); + res.json({ result: true }); + } catch (error) { + res.status(401).json({ result: false, message: '인증 실패' }); + } +}; \ No newline at end of file diff --git a/middlewares/authmiddleware.js b/middlewares/authmiddleware.js new file mode 100644 index 0000000..33d659a --- /dev/null +++ b/middlewares/authmiddleware.js @@ -0,0 +1,20 @@ +const jwt = require('jsonwebtoken'); +const secretKey = process.env.SECRET_KEY || 'your_secret_key'; + +const authenticateJWT = (req, res, next) => { + const authHeader = req.headers['authorization']; + if (authHeader) { + const token = authHeader.split(' ')[1]; + jwt.verify(token, secretKey, (err, user) => { + if (err) { + return res.sendStatus(403); + } + req.user = user; + next(); + }); + } else { + res.sendStatus(401); + } +}; + +module.exports = authenticateJWT; \ No newline at end of file diff --git a/models/quser.js b/models/quser.js new file mode 100644 index 0000000..53f8937 --- /dev/null +++ b/models/quser.js @@ -0,0 +1,45 @@ + +const pool = require('../config/db') + +exports.MsignUp = async (data) => { + const query = `INSERT INTO user (user_id, user_pw, user_nickname) VALUES (?, ?, ?)`; + try { + const [result] = await pool.query(query, [data.id, data.pw, data.username]); + console.log('Database Insert Result:', result); + return result; + } catch (error) { + console.error('Database Insert Error:', error); + throw error; + } +}; + +exports.Mlogin = async (data) => { + const query = `SELECT * FROM user WHERE user_id = ?`; + const [rows] = await pool.query(query, [data.id]); + return rows; +}; + +exports.Minfo = async (id) => { + const query = `SELECT * FROM user WHERE user_id = ?`; + console.log('Executing query:', query, 'with ID:', id); // 로그 추가 + const [rows] = await pool.query(query, [id]); + return rows; +}; + +exports.Mupdate = async (data) => { + const query = `UPDATE user SET user_pw = ?, user_nickname = ? WHERE user_id = ?`; + console.log('Executing update query:', query, 'with data:', data); // 로그 추가 + try { + const [result] = await pool.query(query, [data.pw, data.username, data.id]); + console.log('Database Update Result:', result); // 로그 추가 + return result; + } catch (error) { + console.error('Database Update Error:', error); + throw error; + } +}; +exports.Mdelete = async (data) => { + const query = `DELETE FROM user user_id = ?`; + const [result] = await pool.query(query, [data.id]); + return result; +}; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..0888db4 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,11 @@ +const express = require('express'); +const controller = require('../controller/indexcontroller'); // 경로 확인 +const router = express.Router(); + +// localhost:3000/ +router.get('/', controller.main); +router.get('/login', controller.login); +router.get('/signUp', controller.signUp); +router.get('/profile/:id', controller.profile); + +module.exports = router; \ No newline at end of file diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..9a83abf --- /dev/null +++ b/routes/user.js @@ -0,0 +1,12 @@ +const express = require('express'); +const userController = require('../controller/usercontroller'); // 경로 확인 +const authenticateJWT = require('../middlewares/authmiddleware'); // JWT 미들웨어 경로 확인 +const router = express.Router(); + +router.post('/signUp', userController.CsignUp); +router.post('/login', userController.Clogin); +router.get('/info/:id', authenticateJWT, userController.Cinfo); +router.patch('/update', authenticateJWT, userController.Cupdate); +router.delete('/delete', authenticateJWT, userController.Cdelete); + +module.exports = router; \ No newline at end of file