Olá, estou tendo um problema com o Discourse SSO. O que estou fazendo de errado? Meu código abaixo extrai de minha outra plataforma sem problemas. No entanto, não estou recebendo nenhum nonce.
// Habilita o registro de erros para depuração
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Carrega o arquivo init
require_once '/init.php'; // Atualize este caminho com base na configuração da sua plataforma
// Chave secreta do Discourse Connect e URL para retornar o payload
$sso_secret = 'keyhere'; // Substitua pela sua chave secreta compartilhada do Discourse
$discourse_url = 'https://urlhere.com/session/sso_login'; // Substitua pela sua URL do Discourse
// Inicia a sessão para verificar o estado de login do usuário da plataforma
session_start();
// Verifica se o usuário está logado
if (!isset($_SESSION['uid'])) {
// Se o usuário não estiver logado, redireciona para a página de login da plataforma
header('Location: /clientarea.php');
exit;
}
// Depuração: Registra os parâmetros da solicitação de entrada
error_log("Parâmetros GET recebidos: " . print_r($_GET, true));
// Verifica se recebemos os parâmetros 'sso' e 'sig' do Discourse
if (!isset($_GET['sso']) || !isset($_GET['sig'])) {
error_log("Parâmetros SSO ou SIG ausentes.");
header('Location: /clientarea.php');
exit;
}
// Valida a assinatura SSO usando a chave secreta
$sso = $_GET['sso'];
$sig = $_GET['sig'];
$expected_sig = hash_hmac('sha256', $sso, $sso_secret);
if ($sig !== $expected_sig) {
error_log("Assinatura SSO inválida. Esperado: $expected_sig, Recebido: $sig");
header('Location: /clientarea.php');
exit;
}
// Busca detalhes do cliente da plataforma
$clientDetails = localAPI('getclientsdetails', ['clientid' => $_SESSION['uid']], 'admin');
if ($clientDetails['result'] !== 'success' || !isset($clientDetails['userid'])) {
error_log("Falha ao buscar detalhes do cliente da plataforma.");
header('Location: /clientarea.php');
exit;
}
// Extrai detalhes do usuário
$userId = $clientDetails['userid'];
$email = $clientDetails['email'];
$firstName = $clientDetails['firstname'];
$lastName = $clientDetails['lastname'];
$username = $firstName . ' ' . $lastName;
// Decodifica o payload SSO
$sso_payload = base64_decode($sso);
parse_str($sso_payload, $sso_params);
if (!isset($sso_params['nonce'])) {
error_log("Nonce ausente no payload SSO.");
header('Location: /clientarea.php');
exit;
}
// Prepara o payload SSO de retorno com os detalhes do usuário
$return_payload = [
'nonce' => $sso_params['nonce'],
'email' => $email,
'external_id' => $userId,
'username' => $username,
'name' => $firstName . ' ' . $lastName,
'admin' => 0, // Defina como 1 se o usuário for um administrador, caso contrário, deixe como 0
'moderator' => 0 // Defina como 1 se o usuário for um moderador, caso contrário, deixe como 0
];
// Codifica o payload de retorno em Base64
$query_string = http_build_query($return_payload);
$encoded_payload = base64_encode($query_string);
// Assina o payload codificado com a chave secreta do Discourse
$return_sig = hash_hmac('sha256', $encoded_payload, $sso_secret);
// Depuração: Registra o payload e a assinatura
error_log("Payload de Retorno: " . print_r($return_payload, true));
error_log("Payload Codificado: $encoded_payload");
error_log("Assinatura de Retorno: $return_sig");
// Redireciona para o Discourse com o payload assinado
header("Location: $discourse_url?sso=" . urlencode($encoded_payload) . "&sig=" . urlencode($return_sig));
exit;
Registros de erro:
[25-Sep-2024 14:50:17 UTC] Parâmetros SSO ou SIG ausentes.
[25-Sep-2024 14:53:59 UTC] Parâmetros GET recebidos: Array
(
[sso] => nonce_from_discourse
)
[25-Sep-2024 14:53:59 UTC] Parâmetros SSO ou SIG ausentes.
Não tenho certeza por quê?

