Checkpoint: Ajout de la connexion OAuth2 Microsoft 365 (Azure AD) : route callback /api/auth/azure/callback, bouton Microsoft sur la page de login, variables d'environnement Azure AD configurées
This commit is contained in:
@@ -10,10 +10,11 @@ import { registerOAuthRoutes } from "./oauth";
|
||||
import { appRouter } from "../routers";
|
||||
import { createContext } from "./context";
|
||||
import { serveStatic, setupVite } from "./vite";
|
||||
import { getAllUsers } from "../db";
|
||||
import { getAllUsers, getUserByAzureAdId, getUserByEmail, upsertUser } from "../db";
|
||||
import { startEmailImportService } from "../emailImportService";
|
||||
import { startFolderImportService } from "../folderImportService";
|
||||
import { getImportSettingsByUser } from "../db";
|
||||
import { handleAzureCallback, isAzureAdConfigured, generateToken } from "../auth";
|
||||
|
||||
function isPortAvailable(port: number): Promise<boolean> {
|
||||
return new Promise(resolve => {
|
||||
@@ -143,6 +144,86 @@ async function startServer() {
|
||||
archive.finalize();
|
||||
});
|
||||
|
||||
// ============= AZURE AD OAUTH2 CALLBACK =============
|
||||
app.get("/api/auth/azure/callback", async (req, res) => {
|
||||
const code = req.query.code as string | undefined;
|
||||
const error = req.query.error as string | undefined;
|
||||
|
||||
if (error) {
|
||||
console.error("[Azure AD] Erreur OAuth:", error, req.query.error_description);
|
||||
res.redirect(`/login?error=${encodeURIComponent("Connexion Microsoft refusée")}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!code) {
|
||||
res.redirect("/login?error=" + encodeURIComponent("Code OAuth manquant"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isAzureAdConfigured()) {
|
||||
res.redirect("/login?error=" + encodeURIComponent("Azure AD non configuré"));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const azureUser = await handleAzureCallback(code);
|
||||
|
||||
// Chercher l'utilisateur par azureAdId ou par email
|
||||
let user = await getUserByAzureAdId(azureUser.azureAdId);
|
||||
if (!user) {
|
||||
user = await getUserByEmail(azureUser.email);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
// Créer l'utilisateur automatiquement
|
||||
await upsertUser({
|
||||
email: azureUser.email,
|
||||
name: azureUser.name,
|
||||
azureAdId: azureUser.azureAdId,
|
||||
loginMethod: "azure-ad",
|
||||
isActive: 1,
|
||||
role: "user",
|
||||
});
|
||||
user = await getUserByEmail(azureUser.email);
|
||||
} else {
|
||||
// Mettre à jour l'azureAdId si manquant
|
||||
if (!user.azureAdId) {
|
||||
await upsertUser({
|
||||
email: user.email,
|
||||
azureAdId: azureUser.azureAdId,
|
||||
loginMethod: user.loginMethod,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
res.redirect("/login?error=" + encodeURIComponent("Impossible de créer le compte"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (user.isActive === 0) {
|
||||
res.redirect("/login?error=" + encodeURIComponent("Compte inactif"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Générer le token JWT et poser le cookie
|
||||
const token = generateToken(user);
|
||||
res.cookie("auth_token", token, {
|
||||
httpOnly: true,
|
||||
secure: false,
|
||||
sameSite: "lax",
|
||||
path: "/",
|
||||
maxAge: 7 * 24 * 60 * 60 * 1000,
|
||||
});
|
||||
|
||||
console.log(`[Azure AD] Connexion réussie pour ${user.email}`);
|
||||
res.redirect("/");
|
||||
} catch (err: any) {
|
||||
console.error("[Azure AD] Erreur callback:", err.message);
|
||||
res.redirect("/login?error=" + encodeURIComponent("Erreur d'authentification Microsoft"));
|
||||
}
|
||||
});
|
||||
|
||||
// tRPC API
|
||||
app.use(
|
||||
"/api/trpc",
|
||||
|
||||
Reference in New Issue
Block a user