Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
1 result

mvnw.cmd

Blame
  • 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}`);
    });