Merge branch 'feature/FEATURE0004_Connexion'

This commit is contained in:
ExostFlash 2025-08-29 08:51:21 +02:00
commit ce47113ddb
11 changed files with 349 additions and 157 deletions

51
app.js
View file

@ -1,25 +1,27 @@
const DISCORD_CLIENT_ID = "your_client_id";
const DISCORD_CLIENT_SECRET = "your_client_secret";
const DISCORD_CALLBACK_URL = "http://localhost:3000/auth/discord/callback";
const SESSION_SECRET = "your_session_secret";
// ...existing code...
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const DiscordStrategy = require('passport-discord').Strategy;
const SQLite = require('sqlite3').verbose();
const initDb = require('./db_init');
const path = require('path');
const routes = require('./routes');
const app = express();
// DB SQLite
const db = new SQLite.Database('./database.sqlite', (err) => {
if (err) console.error('Erreur SQLite:', err);
else db.run('CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, username TEXT, discriminator TEXT, avatar TEXT)');
});
let db;
initDb('./database.sqlite')
.then((database) => {
db = database;
console.log('Base de données initialisée.');
})
.catch((err) => {
console.error('Erreur lors de l\'initialisation de la base de données :', err);
process.exit(1);
});
// Sessions
app.use(session({
@ -28,33 +30,6 @@ app.use(session({
saveUninitialized: false
}));
// Passport config
passport.serializeUser((user, done) => done(null, user.id));
passport.deserializeUser((id, done) => {
db.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {
if (err) return done(err);
done(null, row);
});
});
passport.use(new DiscordStrategy({
clientID: DISCORD_CLIENT_ID,
clientSecret: DISCORD_CLIENT_SECRET,
callbackURL: DISCORD_CALLBACK_URL,
scope: ['identify']
}, (accessToken, refreshToken, profile, done) => {
db.run('INSERT OR REPLACE INTO users (id, username, discriminator, avatar) VALUES (?, ?, ?, ?)',
[profile.id, profile.username, profile.discriminator, profile.avatar],
(err) => {
if (err) return done(err);
done(null, profile);
}
);
}));
app.use(passport.initialize());
app.use(passport.session());
// EJS
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
@ -62,5 +37,5 @@ app.set('views', path.join(__dirname, 'views'));
// Routes
app.use('/', routes);
const PORT = process.env.PORT || 3000;
const PORT = 3000;
app.listen(PORT, () => console.log('Serveur lancé sur http://localhost:' + PORT));

Binary file not shown.

25
db_init.js Normal file
View file

@ -0,0 +1,25 @@
const SQLite = require('sqlite3').verbose();
function initDb(dbPath = './database.sqlite') {
return new Promise((resolve, reject) => {
const db = new SQLite.Database(dbPath, (err) => {
if (err) {
reject(err);
} else {
db.run(`CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT,
discord_id TEXT DEFAULT NULL,
google_id TEXT DEFAULT NULL,
discriminator TEXT,
avatar TEXT
)`, (err) => {
if (err) reject(err);
else resolve(db);
});
}
});
});
}
module.exports = initDb;

4
db_instance.js Normal file
View file

@ -0,0 +1,4 @@
// Singleton pour partager l'instance db partout
const SQLite = require('sqlite3').verbose();
const db = new SQLite.Database('./database.sqlite');
module.exports = db;

58
modules/auth/discord.js Normal file
View file

@ -0,0 +1,58 @@
const axios = require("axios");
const { getUserByDId } = require('./../users/getUsers');
const { postUser } = require('./../users/postUsers');
const BOT_ID = "1410258710407811082";
const BOT_SECRET = "Bn5FGfrNZCdG1XpCciOcLkzLmrz6fhib";
const REDIRECT_URI = "http://localhost:3000/auth/discord/callback";
exports.handleDiscordAuth = async (req, res) => {
const code = req.query.code;
if (!code) return res.status(400).json({ error: "Code de validation manquant" });
try {
const params = new URLSearchParams();
params.append("client_id", BOT_ID);
params.append("client_secret", BOT_SECRET);
params.append("grant_type", "authorization_code");
params.append("code", code);
params.append("redirect_uri", REDIRECT_URI);
params.append("scope", "identify email");
const tokenData = await axios.post(
"https://discord.com/api/oauth2/token",
params,
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
}
);
const accessToken = tokenData.data.access_token;
const userResponse = await axios.get("https://discord.com/api/users/@me", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
const userData = userResponse.data;
if (!userData || !userData.id) {
console.error('Réponse Discord inattendue:', userResponse.data);
return res.status(500).json({ error: "Impossible de récupérer les infos utilisateur depuis Discord", details: userResponse.data });
}
let savedUser = await getUserByDId(userData.id);
if (!savedUser) {
const newUser = {
username: userData.username,
discord_id: userData.id,
avatar: userData.avatar
? `https://cdn.discordapp.com/avatars/${userData.id}/${userData.avatar}.png`
: null,
};
savedUser = await postUser(newUser);
}
req.session.user = savedUser;
res.redirect('/');
} catch (err) {
console.error(err.response?.data || err.message);
res.status(500).json({ error: "Erreur lors de la connexion à Discord" });
}
};

55
modules/auth/google.js Normal file
View file

@ -0,0 +1,55 @@
const axios = require("axios");
const { getUserByDId } = require('../users/getUsers');
const { postUser } = require('../users/postUsers');
const CLIEN_ID = "71229835507-9413gbpdamv2qbcb2ov8oda2oqgcsk8q.apps.googleusercontent.com";
const GOOGLE_SECRET = "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";
const REDIRECT_URI = "http://localhost:3000/auth/google/callback";
exports.handleGoogleAuth = async (code, res) => {
if (!code) return res.status(400).json({ error: "Code de validation manquant" });
try {
const params = new URLSearchParams();
params.append("client_id", CLIEN_ID);
params.append("client_secret", GOOGLE_SECRET);
params.append("grant_type", "authorization_code");
params.append("code", code);
params.append("redirect_uri", GOOGLE_REDIRECT_URI);
const tokenData = await axios.post(
"https://oauth2.googleapis.com/token",
params,
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
}
);
const accessToken = tokenData.data.access_token;
const userResponse = await axios.get("https://www.googleapis.com/oauth2/v2/userinfo", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
const userData = userResponse.data;
if (!userData || !userData.id) {
console.error("Réponse Google inattendue:", userResponse.data);
return res.status(500).json({ error: "Impossible de récupérer les infos utilisateur depuis Google", details: userResponse.data });
}
let savedUser = await getUserByGId(userData.id);
if (!savedUser) {
const newUser = {
username: userData.name || userData.email,
google_id: userData.id,
email: userData.email,
avatar: userData.picture || null,
};
savedUser = await postUser(newUser);
}
req.session.user = savedUser;
res.redirect('/');
} catch (err) {
console.error(err.response?.data || err.message);
res.status(500).json({ error: "Erreur lors de la connexion à Google" });
}
};

26
modules/users/getUsers.js Normal file
View file

@ -0,0 +1,26 @@
const db = require('../../db_instance');
module.exports.getUserByDId = async (discordId) => {
return new Promise((resolve, reject) => {
const query = `SELECT * FROM users WHERE discord_id = ?`;
db.get(query, [discordId], (err, row) => {
if (err) {
return reject(err);
}
resolve(row);
});
});
}
module.exports.getUserByGId = async (discordId) => {
return new Promise((resolve, reject) => {
const query = `SELECT * FROM users WHERE google_id = ?`;
db.get(query, [discordId], (err, row) => {
if (err) {
return reject(err);
}
resolve(row);
});
});
}

View file

@ -0,0 +1,20 @@
const db = require('../../db_instance');
module.exports.postUser = (user) => {
return new Promise((resolve, reject) => {
const query = `INSERT INTO users (id, username, discord_id, discriminator, avatar) VALUES (?, ?, ?, ?, ?)`;
const params = [
user.id,
user.username,
user.discord_id,
user.discriminator,
user.avatar
];
db.run(query, params, function(err) {
if (err) {
return reject(err);
}
resolve({ id: this.lastID, ...user });
});
});
}

237
package-lock.json generated
View file

@ -9,12 +9,10 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"dotenv": "^17.2.1",
"axios": "^1.11.0",
"ejs": "^3.1.10",
"express": "^5.1.0",
"express-session": "^1.18.2",
"passport": "^0.7.0",
"passport-discord": "^0.1.4",
"sqlite3": "^5.1.7"
}
},
@ -159,6 +157,23 @@
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
"integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -185,15 +200,6 @@
],
"license": "MIT"
},
"node_modules/base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
"integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
@ -364,6 +370,18 @@
"color-support": "bin.js"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -458,6 +476,15 @@
"node": ">=4.0.0"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@ -483,18 +510,6 @@
"node": ">=8"
}
},
"node_modules/dotenv": {
"version": "17.2.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz",
"integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -612,6 +627,21 @@
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -750,6 +780,63 @@
"node": ">= 0.8"
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/form-data/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/form-data/node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@ -943,6 +1030,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@ -1527,12 +1629,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/oauth": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
"integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==",
"license": "MIT"
},
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@ -1600,61 +1696,6 @@
"node": ">= 0.8"
}
},
"node_modules/passport": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
"integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
"license": "MIT",
"dependencies": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
"utils-merge": "^1.0.1"
},
"engines": {
"node": ">= 0.4.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jaredhanson"
}
},
"node_modules/passport-discord": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/passport-discord/-/passport-discord-0.1.4.tgz",
"integrity": "sha512-VJWPYqSOmh7SaCLw/C+k1ZqCzJnn2frrmQRx1YrcPJ3MQ+Oa31XclbbmqFICSvl8xv3Fqd6YWQ4H4p1MpIN9rA==",
"license": "ISC",
"dependencies": {
"passport-oauth2": "^1.5.0"
}
},
"node_modules/passport-oauth2": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
"integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
"license": "MIT",
"dependencies": {
"base64url": "3.x.x",
"oauth": "0.10.x",
"passport-strategy": "1.x.x",
"uid2": "0.0.x",
"utils-merge": "1.x.x"
},
"engines": {
"node": ">= 0.4.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jaredhanson"
}
},
"node_modules/passport-strategy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
"integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@ -1674,11 +1715,6 @@
"node": ">=16"
}
},
"node_modules/pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@ -1745,6 +1781,12 @@
"node": ">= 0.10"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/pump": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
@ -2327,12 +2369,6 @@
"node": ">= 0.8"
}
},
"node_modules/uid2": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
"integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
"license": "MIT"
},
"node_modules/unique-filename": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
@ -2368,15 +2404,6 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",

View file

@ -15,12 +15,10 @@
"license": "ISC",
"type": "commonjs",
"dependencies": {
"dotenv": "^17.2.1",
"axios": "^1.11.0",
"ejs": "^3.1.10",
"express": "^5.1.0",
"express-session": "^1.18.2",
"passport": "^0.7.0",
"passport-discord": "^0.1.4",
"sqlite3": "^5.1.7"
}
}

View file

@ -1,26 +1,30 @@
const express = require('express');
const passport = require('passport');
const router = express.Router();
// Page d'accueil
router.get('/', (req, res) => {
res.render('index', { user: req.user });
res.render('index', { user: req.session.user });
});
// Auth Discord
router.get('/auth/discord', passport.authenticate('discord'));
router.get('/auth/discord', (req, res) => {
const clientId = '1410258710407811082';
const redirectUri = 'http://localhost:3000/auth/discord/callback';
const scope = 'identify email';
const discordAuthUrl = `https://discord.com/api/oauth2/authorize?client_id=${clientId}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code&scope=${scope}`;
res.redirect(discordAuthUrl);
});
router.get('/auth/discord/callback',
passport.authenticate('discord', { failureRedirect: '/' }),
(req, res) => {
res.redirect('/');
}
);
router.get('/auth/discord/callback', require('./modules/auth/discord').handleDiscordAuth);
// Déconnexion
router.get('/logout', (req, res) => {
req.logout(() => {
res.redirect('/');
req.session.destroy((err) => {
if (err) {
console.error(err);
return res.send("Erreur lors de la déconnexion");
}
res.redirect("/"); // Redirige vers la page d'accueil
});
});