e59-website/html/login/microsoft-callback.php
2024-08-03 09:58:43 +00:00

178 lines
7.8 KiB
PHP

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../../include/variables.php';
require '../../include/init.php';
require("../../include/main-functions.php");
require './vendor/autoload.php'; // Assurez-vous que le fichier autoload de Composer est inclus
// Configuration de l'application
$clientId = 'bab07099-3044-4d44-b3ef-b2b3ba8031e3';
$clientSecret = '8Ak8Q~~_ahJh~qM0D-SMWsKz-w17lQI.ZBInObCm';
$redirectUri = 'https://e59.fr/login/microsoft-callback.php';
$authority = "https://login.microsoftonline.com/common";
$tokenEndpoint = $authority . '/oauth2/v2.0/token';
if (isset($_GET['code'])) {
$code = $_GET['code'];
// Échanger le code contre un jeton
$params = [
'client_id' => $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();
$mail = new PHPMailer(true);
try {
// Paramètres du serveur SMTP
$mail->isSMTP(); // Utiliser SMTP
$mail->Host = 'outlook.office365.com'; // Serveur SMTP Exchange
$mail->SMTPAuth = true; // Activer l'authentification SMTP
$mail->Username = 'smtp@e59.fr'; // Nom d'utilisateur SMTP
$mail->Password = 'WTFdoto5678TFWT'; // Mot de passe SMTP
$mail->SMTPSecure = 'tls'; // Activer le cryptage TLS
$mail->Port = 587; // Port TCP pour TLS
// Destinataires
$mail->setFrom('service-adhesions@e59.fr', 'Adhesions');
$mail->addAddress('communication@e59.fr', 'E59-UVSQ'); // Port TCP à se connecter (tls = 587, ssl = 465)
// Vous pouvez ajouter d'autres destinataires en utilisant $mail->addAddress()
// $mail->addAddress('autre-destinataire@example.com');
// Vous pouvez aussi ajouter des destinataires en copie (CC) ou en copie cachée (BCC)
// $mail->addCC('cc@example.com');
// $mail->addBCC('bcc@example.com');
// Pièces jointes (si nécessaire)
// $mail->addAttachment('/path/to/file.pdf'); // Ajouter un fichier joint
// Contenu de l'email
$mail->isHTML(true); // Activer le format HTML pour l'email
$mail->Subject = 'Nouvel Utilisateur';
$mail->Body = $name . ' a cree un compte sur e59.fr';
$mail->AltBody = $name . ' a cree un compte sur e59.fr';
// Envoyer l'email
$mail->send();
} catch (Exception $e) {
error_log("Erreur de Mailer: {$mail->ErrorInfo}");
}
// 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();
}
?>