/
cyberdzot
/
react-authy
Обзор
Документация
Войти
/
cyberdzot
/
react-authy
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
server/server.js
173 строки
5 KB
Vovqa
Initial commit
21 янв 2025, 03:57
21 янв 2025, 03:57
5053fe4
Код
Авторство
О чём код?
import "dotenv/config"; import express from "express"; import bodyParser from "body-parser"; import cors from "cors"; import jwt from "jsonwebtoken"; import mysql from "mysql2/promise"; import cookieParser from "cookie-parser"; import bcrypt from "bcrypt"; // Настройка соединения с базой данных const pool = mysql.createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, }); pool .getConnection() .then(() => console.log("Database connected successfully")) .catch((err) => { console.error("Database connection failed:", err); process.exit(1); // Завершаем процесс при ошибке подключения }); // Функция проверки токена const authenticateToken = (req, res, next) => { const token = req.cookies.jwt_token; // Получаем токен из куки if (!token) { return res.status(401).send({ message: "Неавторизованный доступ." }); } jwt.verify(token, process.env.JWT_SECRET, (err, user) => { if (err) { return res.status(403).send({ message: "Недействительный токен." }); } req.user = user; next(); }); }; const app = express(); app.use(cookieParser()); app.use(bodyParser.json()); app.use( cors({ // process.env.CLIENT_URL || origin: "http://localhost:5173", credentials: true, }) ); // app.use(cors()); // Разрешаем запросы с любого домена // Маршруты // Регистрация нового пользователя app.post("/api/register", async (req, res) => { const { username, email, password } = req.body; try { const connection = await pool.getConnection(); const [[existingUser]] = await connection.execute( "SELECT id FROM users WHERE username = ? OR email = ?", [username, email] ); if (existingUser) { connection.release(); return res.status(400).send({ message: "Пользователь уже существует." }); } const hashedPassword = await bcrypt.hash(password, 10); await connection.execute( "INSERT INTO users (username, email, password) VALUES (?, ?, ?)", [username, email, hashedPassword] ); connection.release(); res.status(201).send({ message: "Пользователь успешно зарегистрирован!" }); } catch (err) { console.error(err); res.status(500).send({ message: "Произошла ошибка при регистрации." }); } }); // Вход пользователя app.post("/api/login", async (req, res) => { const { username, password } = req.body; try { const connection = await pool.getConnection(); const [[user]] = await connection.execute( "SELECT * FROM users WHERE username = ?", [username] ); connection.release(); if (!user) { return res .status(401) .send({ message: "Неверное имя пользователя или пароль." }); } // Сравниваем введённый пароль с хэшированным в базе данных const passwordMatch = await bcrypt.compare(password, user.password); if (!passwordMatch) { return res .status(401) .send({ message: "Неверное имя пользователя или пароль." }); } // Генерируем JWT токен const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: "1d", // Токен истечет через 1 день }); // Устанавливаем куки с токеном res.cookie("jwt_token", token, { httpOnly: true, maxAge: 24 * 60 * 60 * 1000, // 1 день sameSite: "lax", }); res.send({ message: "Успешный вход!" }); } catch (err) { console.error(err); res.status(500).send({ message: "Произошла ошибка при входе." }); } }); // Проверка токена (может использоваться для защищённых маршрутов) app.get("/api/protected", authenticateToken, (req, res) => { res.send("Привет! Вы вошли."); }); app.get("/api/profile", authenticateToken, async (req, res) => { console.log("Received token in cookies:", req.cookies.jwt_token); // Логируем токен из куки try { const connection = await pool.getConnection(); const [[user]] = await connection.execute( "SELECT id, username, email FROM users WHERE id = ?", [req.user.id] ); connection.release(); if (!user) { return res.status(400).send({ message: "Пользователь не найден." }); } res.send(user); } catch (err) { console.error(err); res .status(500) .send({ message: "Произошла ошибка при получении профиля." }); } }); // Маршрут для выхода с сервера app.post("/api/logout", authenticateToken, async (req, res) => { res.clearCookie("jwt_token"); res.send({ message: "Вы вышли из системы" }); }); // Запуск сервера const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });