Select Git revision
app.js 10.32 KiB
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const cors = require('cors');
app.use(express.urlencoded({ extended: false }));
const passport = require('./config/passport');
app.use(passport.initialize());
//const session = require('express-session');
const jwt = require('jsonwebtoken');
require('dotenv').config();
const secretKey = process.env.JWT_SECRET; // 실제 환경에서는 환경 변수로 관리하세요.
const http = require('http');
const WebSocketServer = require('./WebSocket');
//middleware
app.use(cors({
origin: "http://localhost:3000",
credentials: true,
}));
//비밀번호 변경 라우트 등록
const passwordRoutes = require('./route/conf_password');
//닉네임 변경 라우트 등록
const confNameRoutes = require('./route/conf_name.js');
//회원 탈퇴 라우트 등록
const deleteUser = require('./route/del_user');
//비밀번호 암호화용 모듈
const bcrypt = require('bcrypt');
//User define
const User = require('./models/user');
//Trip define
const Trip = require('./models/trips');
//Favorite define
const Favorite = require('./models/favorite');
// JSON 요청 본문을 파싱하는 미들웨어 추가
app.use(express.json());
//비밀번호 변경 라우트 추가
app.use('/conf_password',passwordRoutes);
//이름 변경 라우트
app.use('/conf_name', confNameRoutes);
//회원 탈퇴 라우트
app.use('/del_user', deleteUser);
//여행 라우트
const tripRoutes = require('./route/tripRoute'); // 라우트 파일 경로
// Routes
app.use('/api/trips', tripRoutes);
//리뷰 라우트
const reviewRoutes = require('./route/review'); // 라우트 파일 경로
app.use('/api/review', reviewRoutes);
//dotenv
require('dotenv').config();
//favorite 라우트
const favoriteRoutes = require('./route/favorites'); // 라우트 파일 경로
app.use('/favorites', favoriteRoutes);
const authenticateToken = require('./middleware/authMiddleware.js');
// 보호된 라우트에 미들웨어 적용
app.use('/conf_password', authenticateToken, passwordRoutes);
app.use('/conf_name', authenticateToken, confNameRoutes);
app.use('/del_user', authenticateToken, deleteUser);
//확인
console.log('GOOGLE_CLIENT_ID:', process.env.GOOGLE_CLIENT_ID);
console.log('GOOGLE_CLIENT_SECRET:', process.env.GOOGLE_CLIENT_SECRET);
// // MongoDB 연결
// mongoose.connect('mongodb://localhost:27017/logininfo', {
// useNewUrlParser: true,
// useUnifiedTopology: true,
// }).then(() => console.log('MongoDB 연결 성공'))
// .catch(err => console.error('MongoDB 연결 오류:', err));
// application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }));
// db connect
mongoose
.connect(process.env.mongoURL, {
useNewUrlParser: true,
useUnifiedTopology: true,
dbName: "festivelo_DB" // 이 이름으로 db가 생성됩니다.
})
.then(() => {console.log(`MongoDB connected to festivelo_DB`);
// DB 연결 확인
const db = mongoose.connection;
console.log('Current database:', db.name);
})
.catch((err) => console.error(err));
// 세션 설정
// app.use(session({
// secret: 'your_secret_key',
// resave: false,
// saveUninitialized: false,
// }));
// Passport 초기화
//app.use(passport.initialize());
//app.use(passport.session());
// Google 로그인 라우트
app.get('/googlelogin',
passport.authenticate('google', { scope: ['profile', 'email'], session: false })
);
//jwt 전--------------------------------------
// app.get('/googlelogin/redirect',
// passport.authenticate('google', { failureRedirect: '/' }),
// (req, res) => {
// const userInfo = encodeURIComponent(JSON.stringify({
// _id: req.user._id,
// email: req.user.email,
// name: req.user.name
// }));
// // 로그인 성공 시 리다이렉트
// res.redirect(`http://localhost:3000/login?user=${userInfo}`);
// console.log(`구글 로그인 성공: ${userInfo}`);
// }
// );
//----------------------------------------------
//jwt 후-----------------------------------------
app.get('/googlelogin/redirect',
passport.authenticate('google', { failureRedirect: '/', session: false }),
(req, res) => {
const token = jwt.sign(
{ userId: req.user._id, email: req.user.email, name: req.user.name },
secretKey,
{ expiresIn: process.env.TOKEN_EXPIRATION }
);
//토큰 생성 정보 로깅
console.log('구글 로그인 토큰 생성:', {
토큰: token,
사용자: {
이름: req.user.name,
이메일: req.user.email,
ID: req.user._id
},
생성시간: new Date().toLocaleString()
});
res.redirect(`http://localhost:3000/login#token=${token}`);
console.log(`구글 로그인 성공: ${req.user.email}`);
}
);
//-------------------------------------------------
// 로그아웃
app.get('/logout', (req, res) => {
// req.logout((err) => {
// if (err) { return next(err); }
// res.redirect('/');
// });
res.clearCookie('token');
res.redirect('/');
});
// 대시보드
app.get('/dashboard', authenticateToken, (req, res) => {
//const hasPassword = !!req.user.password; // 비밀번호가 있는지 확인
//const userName = req.user.name || req.user.email || 'Guest';
res.send(`
<h1>Welcome, ${userName}}</h1>
<a href="/conf_name/change">사용할 이름 변경</a>
<br>
${hasPassword ? '<a href="/conf_password/change">비밀번호 변경</a>' : ''}
<br>
<a href="/logout">Logout</a>
`);
});
// // 홈
// app.get('/', (req, res) => {
// res.send(`
// <h1>Google OAuth Login</h1>
// <a href="/googlelogin">Login with Google</a>
// `);
// });
//signup 경로
app.get('/signup', (req, res) => {
res.sendFile(__dirname + '/public/signup.html'); // login.html 파일 경로 설정
});
//session
// app.get('/conf_password', (req, res) => {
// if (req.isAuthenticated && req.isAuthenticated()) { // 로그인 여부 확인
// res.sendFile(__dirname + '/public/conf_password.html');
// }
// });
//jwt
app.get('/conf_password', authenticateToken, (req, res) => {
res.sendFile(__dirname + '/public/conf_password.html');
});
//홈 - index.html
app.use(express.static('public'));
//일반 로그인
app.post('/login', async (req, res) => {
const { email, password } = req.body;
console.log('로그인 요청:', email, password); // 추가된 로그
try {
// 사용자가 존재하는지 확인
const user = await User.findOne({ email });
if (!user) {
return res.status(400).json({ message: '사용자를 찾을 수 없습니다.' });
}
//password 정보 없는 유저 -> 구글 로그인 사용자
if (!user.password) {
return res.status(400).json({ message: '사용자를 찾을 수 없습니다.' });
}
// 비밀번호 검증
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).json({ message: '비밀번호가 일치하지 않습니다.' });
}
// 로그인 성공 시 사용자 세션에 저장 - 세션 로그인
// req.login(user, (err) => {
// if (err) {
// console.error('로그인 세션 저장 오류:', err);
// return res.status(500).json({ message: '로그인 세션 저장 중 오류가 발생했습니다.' });
// }
// res.status(200).json({ message: '로그인 성공', user: {
// _id: user._id,
// email: user.email,
// name: user.name
// } });
// console.log('로그인 성공: ', user);
//jwt---------------------------------------
const token = jwt.sign(
{ userId: user._id, email: user.email, name: user.name },
secretKey,
{ expiresIn: process.env.TOKEN_EXPIRATION }
);
res.status(200).json({
message: '로그인 성공',
token: token,
user: {
_id: user._id,
email: user.email,
name: user.name
}
});
} catch (error) {
console.error('로그인 오류:', error);
res.status(500).json({ message: '서버 오류가 발생했습니다.' });
}
});
//웹사이트 내 회원가입
app.post('/signup', async (req, res) => {
const { email, password, name } = req.body;
try {
// 존재하는 사용자 확인
let user = await User.findOne({ email });
if (user) {
return res.status(400).json({ message: '이미 존재하는 사용자입니다.' });
}
// 비밀번호 암호화
const hashedPassword = await bcrypt.hash(password, 10);
// 새 사용자 생성 및 저장
user = new User({
email,
password: hashedPassword, // 암호화된 비밀번호 저장
name,
});
await user.save();
// if((!user.password)||(!user.email)||(!user.name)){
// res.status(500).json({ message: '요청 정보가 누락되었습니다.'});
// }
res.status(201).json({ message: '회원가입 성공' });
} catch (error) {
console.error('회원가입 오류:', error);
res.status(500).json({ message: '서버 오류가 발생했습니다.' });
}
});
//토큰 갱신
app.post('/refresh-token', authenticateToken, (req, res) => {
try {
console.log('토큰 갱신 요청 받음:', {
사용자: req.user.email,
요청시간: new Date().toLocaleString()
});
const newToken = jwt.sign(
{
userId: req.user.userId,
email: req.user.email,
name: req.user.name
},
secretKey,
{ expiresIn: process.env.TOKEN_EXPIRATION }
);
console.log('토큰 갱신 성공, 새로운 토큰:', newToken);
res.json({ token: newToken });
} catch (error) {
console.error('토큰 갱신 실패:', error);
res.status(500).json({ message: '토큰 갱신 실패' });
}
});
const server = http.createServer(app);
const wss = new WebSocketServer(server);
server.listen(process.env.PORT, () => {
console.log(`Server is running on http://localhost:${process.env.PORT}`);
});