$clientId, 'scope' => 'openid profile email', 'code' => $code, 'redirect_uri' => $redirectUri, 'grant_type' => 'authorization_code', 'client_secret' => $clientSecret ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $tokenEndpoint); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $token = json_decode($response, true); if (isset($token['access_token'])) { $accessToken = $token['access_token']; // Utiliser le jeton pour obtenir des informations sur l'utilisateur $headers = [ "Authorization: Bearer $accessToken", "Accept: application/json" ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://graph.microsoft.com/v1.0/me"); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $user = json_decode($response, true); // Ajouter une ligne pour enregistrer la valeur de $user dans les logs d'erreur Apache if (!empty($user['mail']) || !empty($user['userPrincipalName'])) { $email = $user['mail'] ?? $user['userPrincipalName']; $name = $user['displayName']; // Convertir en minuscule et retirer les caractères spéciaux et les espaces $username = strtolower($name); $username = preg_replace('/[^a-z0-9]/', '', $username); // Établir la connexion à la base de données $pdo = sqlConnect($sqlDatabaseHost, $sqlDatabaseName, $sqlDatabaseUser, $sqlDatabasePass); // Vérifiez si l'utilisateur existe dans la base de données par email $sqlRequest = "SELECT ID, username, display_name, role, accreditation FROM users WHERE email = :email"; $request = $pdo->prepare($sqlRequest); $request->bindParam(":email", $email); $request->execute(); $result = $request->fetchAll(PDO::FETCH_ASSOC); if ($result) { // L'utilisateur existe, connectez-le session_start(); $_SESSION['userID'] = $result[0]['ID']; $_SESSION['userName'] = $result[0]['username']; $_SESSION['userDisplayName'] = $result[0]['display_name']; $_SESSION['userRole'] = $result[0]['role']; $_SESSION['userAccreditation'] = $result[0]['accreditation']; } else { // Vérifiez si le nom d'utilisateur existe déjà $usernameCheck = $pdo->prepare("SELECT COUNT(*) FROM users WHERE username = :username"); $usernameCheck->bindParam(":username", $username); $usernameCheck->execute(); $count = $usernameCheck->fetchColumn(); // Ajouter un identifiant unique si le nom d'utilisateur existe déjà $originalUsername = $username; $suffix = 1; while ($count > 0) { $username = $originalUsername . $suffix; $usernameCheck->bindParam(":username", $username); $usernameCheck->execute(); $count = $usernameCheck->fetchColumn(); $suffix++; } // L'utilisateur n'existe pas, créez-le $defaultPassword = ''; // Vous pouvez également générer un mot de passe aléatoire ou utiliser une valeur par défaut $sqlInsert = "INSERT INTO users (username, email, display_name, role, password) VALUES (:username, :email, :display_name, 1, :password)"; $insert = $pdo->prepare($sqlInsert); $insert->bindParam(":username", $username); $insert->bindParam(":email", $email); $insert->bindParam(":display_name", $name); $insert->bindParam(":password", $defaultPassword); $insert->execute(); // Récupérez l'ID du nouvel utilisateur $userID = $pdo->lastInsertId(); $from = "no-reply@e59.fr"; $fromName = "Association E59"; $to = "communication@e59.fr"; $subject = "Nouvel utilisateur"; $body = "$name a créé un compte sur e59.fr"; $altbody = "$name a créé un compte sur e59.fr"; sendMail($from, $fromName, $to, $subject, $body, $altbody); // Connectez l'utilisateur session_start(); $_SESSION['userID'] = $userID; $_SESSION['userName'] = $username; $_SESSION['userDisplayName'] = $name; $_SESSION['userRole'] = 'user'; $_SESSION['userAccreditation'] = null; } // Redirection vers la page d'accueil ou une autre page header('Location: /'); exit(); } else { error_log('Impossible d\'obtenir les informations utilisateur.'); echo 'Impossible d\'obtenir les informations utilisateur.'; } } else { error_log('Impossible d\'obtenir le jeton d\'accès.'); echo 'Impossible d\'obtenir le jeton d\'accès.'; } } else { header('Location: /login.php'); exit(); } ?>