From f43a216cbdae4232115145c172803cac5de3aa44 Mon Sep 17 00:00:00 2001 From: ExostFlash Date: Wed, 27 Aug 2025 16:10:58 +0200 Subject: [PATCH 1/2] Discord Auth it's ok --- app.js | 51 ++------ database.sqlite | Bin 12288 -> 12288 bytes db_init.js | 24 ++++ db_instance.js | 4 + modules/auth/discord.js | 58 +++++++++ modules/users/getUsers.js | 14 +++ modules/users/postUsers.js | 20 ++++ package-lock.json | 237 +++++++++++++++++++++---------------- package.json | 4 +- routes.js | 26 ++-- 10 files changed, 281 insertions(+), 157 deletions(-) create mode 100644 db_init.js create mode 100644 db_instance.js create mode 100644 modules/auth/discord.js create mode 100644 modules/users/getUsers.js create mode 100644 modules/users/postUsers.js diff --git a/app.js b/app.js index 2371209..0644497 100644 --- a/app.js +++ b/app.js @@ -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)); diff --git a/database.sqlite b/database.sqlite index b1452ced493fcf8d15e1855c63f4a6f9523a9d03..98766f41596acbfa046dab4e8d7d0be9155ad921 100644 GIT binary patch delta 362 zcmZojXh@hK&B!!S##xYwL9b{LFaHk)CVoB!em?%Q8w=<0aW&d7vWtt0Gd6`!PUTmr z=Td-!%oK$X*N6~>fFMs_$Dl|BZ`Vj2BDJZtm*H2E#(}TJvv7kUNIX_n)XbaGiVtq_a z`l+VLsfLy*7KRonh89VQW+~>$sm2ybMyckeMyAP$W_ksA>0De43=E9?e;D}x0NwMR MpB>0$W@g|70HgI>%>V!Z delta 146 zcmZojXh@hK&B!=W##xY&L9b{LFaHk)CjJ-({uutVn*{~l@NwodvWtt0Gd9{zmf%-$ z&P-7Vag7L32nh1@bqtDB@OF*VQ7A1=Ey_#GO$AHoD5PW-Cl_VrX67Z9 { + 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, + discriminator TEXT, + avatar TEXT + )`, (err) => { + if (err) reject(err); + else resolve(db); + }); + } + }); + }); +} + +module.exports = initDb; diff --git a/db_instance.js b/db_instance.js new file mode 100644 index 0000000..78969cb --- /dev/null +++ b/db_instance.js @@ -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; diff --git a/modules/auth/discord.js b/modules/auth/discord.js new file mode 100644 index 0000000..21569dc --- /dev/null +++ b/modules/auth/discord.js @@ -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" }); + } +}; \ No newline at end of file diff --git a/modules/users/getUsers.js b/modules/users/getUsers.js new file mode 100644 index 0000000..903461b --- /dev/null +++ b/modules/users/getUsers.js @@ -0,0 +1,14 @@ + +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); + }); + }); +} \ No newline at end of file diff --git a/modules/users/postUsers.js b/modules/users/postUsers.js new file mode 100644 index 0000000..3055ee1 --- /dev/null +++ b/modules/users/postUsers.js @@ -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 }); + }); + }); +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 28f1223..6e11517 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 7b151f3..6b1d310 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/routes.js b/routes.js index 73b52f7..937bb6d 100644 --- a/routes.js +++ b/routes.js @@ -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 }); }); From 9e7d81323b2d1dd89aeede35f1686182f4bfdfd2 Mon Sep 17 00:00:00 2001 From: ExostFlash Date: Wed, 27 Aug 2025 16:30:29 +0200 Subject: [PATCH 2/2] Google adding ... --- database.sqlite | Bin 12288 -> 0 bytes db_init.js | 3 ++- modules/auth/google.js | 55 ++++++++++++++++++++++++++++++++++++++ modules/users/getUsers.js | 12 +++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) delete mode 100644 database.sqlite create mode 100644 modules/auth/google.js diff --git a/database.sqlite b/database.sqlite deleted file mode 100644 index 98766f41596acbfa046dab4e8d7d0be9155ad921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI$O;5rw7zgln7+*+W-gd1wO$=j0U>HqAvx5;6MH1yi%2s3vY`7J}#RGm6zmMO? zg9pn5L*(Fzi}^ok*R{`{Z2R5XyW2(}1?xrekV{q~yM$75#uy<)Q$3^lBB;9ASWMJ7 zoBtIWDa3C%{ex(Fp6Ge~{jUP#ApijgKmY;|fB*y_009U<00Qe5n4Zur!!YRUz2x12 z7$+i5(u;P{bn7jbwd&^$m!(T=Kg)h1@L9`!XtA5-<#oN;W>;?ea49`22>DQ?4=pGB zAn~Hu@679er{Z83gj`1PN+Eydl7BD%yyxIR+cZuMN`lZAljLcjcJ>`UmQgzIq+i{! z(qXo*-=2BqRHyossD^+51Rwwb2tWV=5P$##AOHafKww=0FLaCSS!7xllPHnB0Z;l> zr&P3@Vx?NE6>Z11kBWUMN6E2idVW}#9~tn`sNh9I^ZOtmF;|OBQTBvY^Bv3aEvL&X ze$^8tr)!I9*)Ds$QW%AgS@mC3|0Jp*AOHafKmY;|fB*y_009U<00I#BhXR=l+4%zV CpK*Nv diff --git a/db_init.js b/db_init.js index 56bc850..163ea5c 100644 --- a/db_init.js +++ b/db_init.js @@ -9,7 +9,8 @@ function initDb(dbPath = './database.sqlite') { db.run(`CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, username TEXT, - discord_id TEXT, + discord_id TEXT DEFAULT NULL, + google_id TEXT DEFAULT NULL, discriminator TEXT, avatar TEXT )`, (err) => { diff --git a/modules/auth/google.js b/modules/auth/google.js new file mode 100644 index 0000000..f0bb22b --- /dev/null +++ b/modules/auth/google.js @@ -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" }); + } +}; \ No newline at end of file diff --git a/modules/users/getUsers.js b/modules/users/getUsers.js index 903461b..0a197e2 100644 --- a/modules/users/getUsers.js +++ b/modules/users/getUsers.js @@ -11,4 +11,16 @@ module.exports.getUserByDId = async (discordId) => { 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); + }); + }); } \ No newline at end of file