Salut, j’ai un problème avec Discourse SSO. Qu’est-ce que je fais mal ? Mon code ci-dessous extrait d’autres plateformes sans problème. Cependant, je n’obtiens aucun nonce.
// Activer la journalisation des erreurs pour le débogage
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Charger le fichier d'initialisation
require_once '/init.php'; // Mettez à jour ce chemin en fonction de la configuration de votre plateforme
// Clé secrète Discourse Connect et URL pour renvoyer la charge utile
$sso_secret = 'keyhere'; // Remplacez par votre clé secrète partagée Discourse
$discourse_url = 'https://urlhere.com/session/sso_login'; // Remplacez par votre URL Discourse
// Démarrer la session pour vérifier l'état de connexion de l'utilisateur de la plateforme
session_start();
// Vérifier si l'utilisateur est connecté
if (!isset($_SESSION['uid'])) {
// Si l'utilisateur n'est pas connecté, rediriger vers la page de connexion de la plateforme
header('Location: /clientarea.php');
exit;
}
// Débogage : journaliser les paramètres de la requête entrante
error_log("Paramètres GET reçus : " . print_r($_GET, true));
// Vérifier si nous avons reçu les paramètres 'sso' et 'sig' de Discourse
if (!isset($_GET['sso']) || !isset($_GET['sig'])) {
error_log("Paramètres SSO ou SIG manquants.");
header('Location: /clientarea.php');
exit;
}
// Valider la signature SSO à l'aide de la clé secrète
$sso = $_GET['sso'];
$sig = $_GET['sig'];
$expected_sig = hash_hmac('sha256', $sso, $sso_secret);
if ($sig !== $expected_sig) {
error_log("Signature SSO invalide. Attendu : $expected_sig, Reçu : $sig");
header('Location: /clientarea.php');
exit;
}
// Récupérer les détails du client de la plateforme
$clientDetails = localAPI('getclientsdetails', ['clientid' => $_SESSION['uid']], 'admin');
if ($clientDetails['result'] !== 'success' || !isset($clientDetails['userid'])) {
error_log("Échec de la récupération des détails du client de la plateforme.");
header('Location: /clientarea.php');
exit;
}
// Extraire les détails de l'utilisateur
$userId = $clientDetails['userid'];
$email = $clientDetails['email'];
$firstName = $clientDetails['firstname'];
$lastName = $clientDetails['lastname'];
$username = $firstName . ' ' . $lastName;
// Décoder la charge utile SSO
$sso_payload = base64_decode($sso);
parse_str($sso_payload, $sso_params);
if (!isset($sso_params['nonce'])) {
error_log("Le nonce est manquant dans la charge utile SSO.");
header('Location: /clientarea.php');
exit;
}
// Préparer la charge utile SSO de retour avec les détails de l'utilisateur
$return_payload = [
'nonce' => $sso_params['nonce'],
'email' => $email,
'external_id' => $userId,
'username' => $username,
'name' => $firstName . ' ' . $lastName,
'admin' => 0, // Mettre à 1 si l'utilisateur est un administrateur, sinon laisser à 0
'moderator' => 0 // Mettre à 1 si l'utilisateur est un modérateur, sinon laisser à 0
];
// Encoder la charge utile de retour en Base64
$query_string = http_build_query($return_payload);
$encoded_payload = base64_encode($query_string);
// Signer la charge utile encodée avec la clé secrète Discourse
$return_sig = hash_hmac('sha256', $encoded_payload, $sso_secret);
// Débogage : journaliser la charge utile et la signature
error_log("Charge utile de retour : " . print_r($return_payload, true));
error_log("Charge utile encodée : $encoded_payload");
error_log("Signature de retour : $return_sig");
// Rediriger vers Discourse avec la charge utile signée
header("Location: $discourse_url?sso=" . urlencode($encoded_payload) . "&sig=" . urlencode($return_sig));
exit;
Journaux d’erreurs :
[25-Sep-2024 14:50:17 UTC] Paramètres SSO ou SIG manquants.
[25-Sep-2024 14:53:59 UTC] Paramètres GET reçus : Array
(
[sso] => nonce_from_discourse
)
[25-Sep-2024 14:53:59 UTC] Paramètres SSO ou SIG manquants.
Je ne suis pas sûr pourquoi ?

