안녕하세요, Discourse SSO에서 문제가 발생하고 있습니다. 제가 뭘 잘못하고 있는 건가요? 아래 코드는 다른 플랫폼에서 추출할 때는 문제가 없습니다. 하지만 nonce를 받지 못하고 있습니다.
<?php
// 디버깅을 위해 오류 로그 활성화
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// init 파일 로드
require_once '/init.php'; // 플랫폼 설정에 따라 이 경로를 업데이트하세요
// Discourse Connect 시크릿 키 및 페이로드 반환 URL
$sso_secret = 'keyhere'; // Discourse 공유 시크릿 키로 교체하세요
$discourse_url = 'https://urlhere.com/session/sso_login'; // Discourse URL로 교체하세요
// 플랫폼 사용자 로그인 상태를 확인하기 위해 세션 시작
session_start();
// 사용자가 로그인되어 있는지 확인
if (!isset($_SESSION['uid'])) {
// 사용자가 로그인되지 않은 경우, 플랫폼 로그인 페이지로 리다이렉트
header('Location: /clientarea.php');
exit;
}
// 디버그: 수신된 요청 매개변수 기록
error_log("Received GET parameters: " . print_r($_GET, true));
// Discourse에서 'sso' 및 'sig' 매개변수를 받았는지 확인
if (!isset($_GET['sso']) || !isset($_GET['sig'])) {
error_log("Missing SSO or SIG parameters.");
header('Location: /clientarea.php');
exit;
}
// 시크릿 키를 사용하여 SSO 서명을 검증
$sso = $_GET['sso'];
$sig = $_GET['sig'];
$expected_sig = hash_hmac('sha256', $sso, $sso_secret);
if ($sig !== $expected_sig) {
error_log("Invalid SSO signature. Expected: $expected_sig, Received: $sig");
header('Location: /clientarea.php');
exit;
}
// 플랫폼 클라이언트 세부 정보 가져오기
$clientDetails = localAPI('getclientsdetails', ['clientid' => $_SESSION['uid']], 'admin');
if ($clientDetails['result'] !== 'success' || !isset($clientDetails['userid'])) {
error_log("Failed to fetch Platform client details.");
header('Location: /clientarea.php');
exit;
}
// 사용자 세부 정보 추출
$userId = $clientDetails['userid'];
$email = $clientDetails['email'];
$firstName = $clientDetails['firstname'];
$lastName = $clientDetails['lastname'];
$username = $firstName . ' ' . $lastName;
// SSO 페이로드 디코딩
$sso_payload = base64_decode($sso);
parse_str($sso_payload, $sso_params);
if (!isset($sso_params['nonce'])) {
error_log("Nonce is missing from SSO payload.");
header('Location: /clientarea.php');
exit;
}
// 사용자 세부 정보를 포함한 반환 SSO 페이로드 준비
$return_payload = [
'nonce' => $sso_params['nonce'],
'email' => $email,
'external_id' => $userId,
'username' => $username,
'name' => $firstName . ' ' . $lastName,
'admin' => 0, // 사용자가 관리자라면 1로 설정, 아니면 0으로 유지
'moderator' => 0 // 사용자가 모더레이터라면 1로 설정, 아니면 0으로 유지
];
// 반환 페이로드를 Base64로 인코딩
$query_string = http_build_query($return_payload);
$encoded_payload = base64_encode($query_string);
// Discourse 시크릿으로 인코딩된 페이로드에 서명
$return_sig = hash_hmac('sha256', $encoded_payload, $sso_secret);
// 디버그: 페이로드 및 서명 기록
error_log("Return Payload: " . print_r($return_payload, true));
error_log("Encoded Payload: $encoded_payload");
error_log("Return Signature: $return_sig");
// 서명된 페이로드와 함께 Discourse로 리다이렉트
header("Location: $discourse_url?sso=" . urlencode($encoded_payload) . "&sig=" . urlencode($return_sig));
exit;
오류 로그:
[25-Sep-2024 14:50:17 UTC] Missing SSO or SIG parameters.
[25-Sep-2024 14:53:59 UTC] Received GET parameters: Array
(
[sso] => nonce_from_discourse
)
[25-Sep-2024 14:53:59 UTC] Missing SSO or SIG parameters.
이유를 모르겠네요?

