diff --git a/database.sqlite b/database.sqlite deleted file mode 100644 index 98766f4..0000000 Binary files a/database.sqlite and /dev/null differ 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