This commit is contained in:
Jeremy Kirsch 2026-05-17 20:35:05 +02:00
parent 60262323a3
commit db35882a18
3 changed files with 25 additions and 24 deletions

View File

@ -63,7 +63,7 @@ mysql -u blair_user -p blair_dashboard < /var/www/blair/schema.sql
``` ```
https://deinedomain.de/auth/discord/callback https://deinedomain.de/auth/discord/callback
``` ```
4. Kopiere **Client ID** und **Client Secret** 4. Kopiere **Client ID** 1505635813072044062 und **Client Secret** fXQyM6oXGQWR23m3QbilHLTJiObg_kP-
--- ---

View File

@ -14,7 +14,7 @@
"passport": "^0.6.0", "passport": "^0.6.0",
"passport-discord": "^0.1.4", "passport-discord": "^0.1.4",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"connect-mysql-session": "^0.4.1", "express-mysql-session": "^3.0.0",
"helmet": "^7.1.0", "helmet": "^7.1.0",
"cors": "^2.8.5" "cors": "^2.8.5"
}, },

View File

@ -1,15 +1,15 @@
require('dotenv').config(); require('dotenv').config();
const express = require('express'); const express = require('express');
const session = require('express-session'); const session = require('express-session');
const passport = require('passport'); const passport = require('passport');
const helmet = require('helmet'); const helmet = require('helmet');
const path = require('path'); const path = require('path');
const db = require('./db'); const db = require('./db');
const authRoutes = require('./routes/auth'); const authRoutes = require('./routes/auth');
const apiRoutes = require('./routes/api'); const apiRoutes = require('./routes/api');
const adminRoutes = require('./routes/admin'); const adminRoutes = require('./routes/admin');
const app = express(); const app = express();
const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;
// ── Security headers ────────────────────────────────── // ── Security headers ──────────────────────────────────
@ -17,10 +17,10 @@ app.use(helmet({
contentSecurityPolicy: { contentSecurityPolicy: {
directives: { directives: {
defaultSrc: ["'self'"], defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'", "fonts.googleapis.com"], scriptSrc: ["'self'", "'unsafe-inline'", "fonts.googleapis.com"],
styleSrc: ["'self'", "'unsafe-inline'", "fonts.googleapis.com", "fonts.gstatic.com"], styleSrc: ["'self'", "'unsafe-inline'", "fonts.googleapis.com", "fonts.gstatic.com"],
fontSrc: ["'self'", "fonts.gstatic.com", "fonts.googleapis.com"], fontSrc: ["'self'", "fonts.gstatic.com", "fonts.googleapis.com"],
imgSrc: ["'self'", "data:", "cdn.discordapp.com"], imgSrc: ["'self'", "data:", "cdn.discordapp.com"],
connectSrc: ["'self'", "discord.com"], connectSrc: ["'self'", "discord.com"],
}, },
}, },
@ -31,21 +31,22 @@ app.use(express.json());
app.use(express.urlencoded({ extended: true })); app.use(express.urlencoded({ extended: true }));
// ── Session with MySQL store ────────────────────────── // ── Session with MySQL store ──────────────────────────
const MySQLStore = require('connect-mysql-session')(session); const MySQLStore = require('express-mysql-session')(session);
app.use(session({ app.use(session({
secret: process.env.SESSION_SECRET, secret: process.env.SESSION_SECRET,
resave: false, resave: false,
saveUninitialized: false, saveUninitialized: false,
store: new MySQLStore({ store: new MySQLStore({
host: process.env.DB_HOST, host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT) || 3306, port: parseInt(process.env.DB_PORT) || 3306,
database: process.env.DB_NAME, database: process.env.DB_NAME,
user: process.env.DB_USER, user: process.env.DB_USER,
password: process.env.DB_PASS, password: process.env.DB_PASS,
createDatabaseTable: true,
}), }),
cookie: { cookie: {
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 Tage maxAge: 7 * 24 * 60 * 60 * 1000, // 7 Tage
secure: process.env.NODE_ENV === 'production', secure: process.env.NODE_ENV === 'production',
httpOnly: true, httpOnly: true,
sameSite: 'lax', sameSite: 'lax',
}, },
@ -60,8 +61,8 @@ app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public')));
// ── Routes ──────────────────────────────────────────── // ── Routes ────────────────────────────────────────────
app.use('/auth', authRoutes); app.use('/auth', authRoutes);
app.use('/api', apiRoutes); app.use('/api', apiRoutes);
app.use('/admin', adminRoutes); app.use('/admin', adminRoutes);
// ── SPA fallback ────────────────────────────────────── // ── SPA fallback ──────────────────────────────────────