Init Discord OAuth2

This commit is contained in:
Arthur Puechberty
2026-01-14 23:58:42 +01:00
commit b18657e01c
7 changed files with 1288 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
require("dotenv").config(); // charge les variables depuis .env
const express = require("express");
const session = require("express-session");
const fetch = require("cross-fetch"); // fetch compatible Node
const path = require("path");
const app = express();
const PORT = process.env.PORT || 3000;
const CLIENT_ID = process.env.CLIENT_ID;
const CLIENT_SECRET = process.env.CLIENT_SECRET;
const REDIRECT_URI = process.env.REDIRECT_URI;
// --- Session setup ---
app.use(session({
secret: "un_secret_long_et_complexe", // change-le en production
resave: false,
saveUninitialized: true,
}));
// --- Servir le dossier public ---
app.use(express.static(path.join(__dirname, "public")));
// --- Route pour démarrer la connexion Discord ---
app.get("/auth/discord", (req, res) => {
const url = `https://discord.com/api/oauth2/authorize?client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&response_type=code&scope=identify`;
res.redirect(url);
});
// --- Callback après connexion Discord ---
app.get("/auth/discord/callback", async (req, res) => {
const code = req.query.code;
if (!code) return res.send("Pas de code OAuth reçu !");
try {
// Échange du code contre access token
const data = new URLSearchParams();
data.append("client_id", CLIENT_ID);
data.append("client_secret", CLIENT_SECRET);
data.append("grant_type", "authorization_code");
data.append("code", code);
data.append("redirect_uri", REDIRECT_URI);
data.append("scope", "identify");
const tokenResponse = await fetch("https://discord.com/api/oauth2/token", {
method: "POST",
body: data,
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});
const tokenJson = await tokenResponse.json();
const accessToken = tokenJson.access_token;
// Récupération des infos utilisateur
const userResponse = await fetch("https://discord.com/api/users/@me", {
headers: { Authorization: `Bearer ${accessToken}` },
});
const user = await userResponse.json();
// Stocker l'utilisateur dans la session
req.session.user = user;
// Rediriger vers la page HTML
res.redirect("/welcome.html");
} catch (err) {
console.error(err);
res.send("Erreur lors de la connexion Discord !");
}
});
// --- API pour récupérer l'objet user côté front ---
app.get("/api/user", (req, res) => {
if (req.session.user) {
res.json(req.session.user);
} else {
res.status(401).json({ error: "Utilisateur non connecté" });
}
});
// --- Lancement du serveur ---
app.listen(PORT, () => console.log(`Serveur lancé sur http://localhost:${PORT}`));