# SSO-Problem: Fehlende SSO- oder SIG-Parameter

**URL:** <https://meta.discourse.org/t/sso-issue-missing-sso-or-sig-parameters/328082>\
**Category:** SSO\
**Created:** [25. September 2024 um 15:03 UTC](https://meta.discourse.org/t/sso-issue-missing-sso-or-sig-parameters/328082 "2024-09-25T15:03:45Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![John\_Smith](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/john_smith/32/451751_2.png) [@John\_Smith](https://meta.discourse.org/u/John_Smith)\
**Post date:** [25. September 2024 um 15:03 UTC](https://meta.discourse.org/t/sso-issue-missing-sso-or-sig-parameters/328082/1 "2024-09-25T15:03:45Z")

</div>

Hallo, ich habe ein Problem mit [Discourse SSO](https://meta.discourse.org/t/13045?silent=true). Was mache ich falsch? Mein Code extrahiert problemlos von meiner anderen Plattform. Allerdings bekomme ich keinen Nonce.

```php

// Fehlerprotokollierung zur Fehlerbehebung aktivieren
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Init-Datei laden
require_once '/init.php'; // Aktualisieren Sie diesen Pfad basierend auf Ihrer Plattform-Einrichtung

// Discourse Connect Secret Key und URL zum Zurücksenden der Nutzlast
$sso_secret = 'keyhere'; // Ersetzen Sie dies durch Ihren Discourse Shared Secret Key
$discourse_url = 'https://urlhere.com/session/sso_login'; // Ersetzen Sie dies durch Ihre Discourse-URL

// Sitzung starten, um den Anmeldestatus des Plattform-Benutzers zu überprüfen
session_start();

// Überprüfen, ob der Benutzer angemeldet ist
if (!isset($_SESSION['uid'])) {
    // Wenn der Benutzer nicht angemeldet ist, zur Anmeldeseite der Plattform weiterleiten
    header('Location: /clientarea.php');
    exit;
}

// Debug: Eingehende Anfrageparameter protokollieren
error_log("Empfangene GET-Parameter: " . print_r($_GET, true));

// Überprüfen, ob wir die Parameter 'sso' und 'sig' von Discourse erhalten haben
if (!isset($_GET['sso']) || !isset($_GET['sig'])) {
    error_log("Fehlende SSO- oder SIG-Parameter.");
    header('Location: /clientarea.php');
    exit;
}

// Die SSO-Signatur mit dem Secret Key validieren
$sso = $_GET['sso'];
$sig = $_GET['sig'];
$expected_sig = hash_hmac('sha256', $sso, $sso_secret);

if ($sig !== $expected_sig) {
    error_log("Ungültige SSO-Signatur. Erwartet: $expected_sig, Empfangen: $sig");
    header('Location: /clientarea.php');
    exit;
}

// Plattform-Client-Details abrufen
$clientDetails = localAPI('getclientsdetails', ['clientid' => $_SESSION['uid']], 'admin');
if ($clientDetails['result'] !== 'success' || !isset($clientDetails['userid'])) {
    error_log("Fehler beim Abrufen der Plattform-Client-Details.");
    header('Location: /clientarea.php');
    exit;
}

// Benutzerdetails extrahieren
$userId = $clientDetails['userid'];
$email = $clientDetails['email'];
$firstName = $clientDetails['firstname'];
$lastName = $clientDetails['lastname'];
$username = $firstName . ' ' . $lastName;

// Die SSO-Nutzlast dekodieren
$sso_payload = base64_decode($sso);
parse_str($sso_payload, $sso_params);

if (!isset($sso_params['nonce'])) {
    error_log("Nonce fehlt in der SSO-Nutzlast.");
    header('Location: /clientarea.php');
    exit;
}

// Die Rückgabe-SSO-Nutzlast mit Benutzerdetails vorbereiten
$return_payload = [
    'nonce' => $sso_params['nonce'],
    'email' => $email,
    'external_id' => $userId,
    'username' => $username,
    'name' => $firstName . ' ' . $lastName,
    'admin' => 0, // Auf 1 setzen, wenn der Benutzer ein Administrator ist, andernfalls auf 0 lassen
    'moderator' => 0 // Auf 1 setzen, wenn der Benutzer ein Moderator ist, andernfalls auf 0 lassen
];

// Die Rückgabe-Nutzlast Base64-codieren
$query_string = http_build_query($return_payload);
$encoded_payload = base64_encode($query_string);

// Die codierte Nutzlast mit dem Discourse-Secret signieren
$return_sig = hash_hmac('sha256', $encoded_payload, $sso_secret);

// Debug: Nutzlast und Signatur protokollieren
error_log("Rückgabe-Nutzlast: " . print_r($return_payload, true));
error_log("Codierte Nutzlast: $encoded_payload");
error_log("Rückgabe-Signatur: $return_sig");

// Zu Discourse mit der signierten Nutzlast weiterleiten
header("Location: $discourse_url?sso=" . urlencode($encoded_payload) . "&sig=" . urlencode($return_sig));
exit;

```

Fehlerprotokolle:

[25-Sep-2024 14:50:17 UTC] Fehlende SSO- oder SIG-Parameter.  
[25-Sep-2024 14:53:59 UTC] Empfangene GET-Parameter: Array  
(  
[sso] =\> nonce\_from\_discourse  
)

[25-Sep-2024 14:53:59 UTC] Fehlende SSO- oder SIG-Parameter.

Ich bin mir nicht sicher, warum?

---

_[View the full topic](https://meta.discourse.org/t/sso-issue-missing-sso-or-sig-parameters/328082)._
