SSO ne fonctionne pas pour moi

Je rencontre des problèmes avec mon SSO, il indique qu’il n’y a pas d’external_Id.

PHP :

    <?php
    $user = $_SESSION['username'];
    try {
    	$handler = new PDO('mysql:host=localhost;dbname=removed', 'removed', 'removed');
    	$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
    	echo $e->getMessage();
    	die();
    }
    $conn = mysql_connect("localhost", "removed", "removed");
    mysql_select_db("removed");
    if ($user) {
    $myusr = $handler->query("SELECT * FROM users WHERE username='".$user."'");
    $myu = $myusr->fetch(PDO::FETCH_OBJ);
    if ($myu->banned == "1") {
        header('Location: https://bloxplays.com/suspended');
    }
    $userExist = ($myusr->rowCount());
    if ($userExist == "0") {
    session_destroy();
    header("Location: ../");
    } else {
        $ID = $myu->id;
    }
    }
    echo "<title>".$ID."</title>";
    namespace Cviebrock\DiscoursePHP;

    use Cviebrock\DiscoursePHP\Exception\PayloadException;


    class SSOHelper
    {

        /**
         * @var
         */
        private $secret;

        /**
         * @param $secret
         * @return $this
         */
        public function setSecret($secret)
        {
            $this->secret = $secret;

            return $this;
        }

        /**
         * @param $payload
         * @param $signature
         * @return mixed
         */
        public function validatePayload($payload, $signature)
        {
            $payload = urldecode($payload);

            return $this->signPayload($payload) === $signature;
        }

        /**
         * @param $payload
         * @return mixed
         * @throws PayloadException
         */
        public function getNonce($payload)
        {
            $payload = urldecode($payload);
            $query = array();
            parse_str(base64_decode($payload), $query);
            if (!array_key_exists('nonce', $query)) {
                throw new PayloadException('Nonce non trouvé dans le payload');
            }

            return $query['nonce'];
        }

        /**
         * @param $payload
         * @return mixed
         * @throws PayloadException
         */
        public function getReturnSSOURL($payload)
        {
            $payload = urldecode($payload);
            $query = array();
            parse_str(base64_decode($payload), $query);
            if (!array_key_exists('return_sso_url', $query)) {
                throw new PayloadException('URL de retour SSO non trouvée dans le payload');
            }

            return $query['return_sso_url'];
        }

        /**
         * @param $nonce
         * @param $id
         * @param $email
         * @param array $extraParameters
         * @return string
         */
        public function getSignInString($nonce, $id, $email, $extraParameters = [])
        {

            $parameters = array(
                    'nonce'       => $nonce,
                    'external_id' => $id,
                    'email'       => $email,
                ) + $extraParameters;

            $payload = base64_encode(http_build_query($parameters));

            $data = array(
                'sso' => $payload,
                'sig' => $this->signPayload($payload),
            );

            return http_build_query($data);
        }

        /**
         * @param $payload
         * @return string
         */
        protected function signPayload($payload)
        {
            return hash_hmac('sha256', $payload, $this->secret);
        }
    }
    ?>

    <?php

    $sso = new SSOHelper();

    // cela doit être identique dans votre code et dans vos paramètres Discourse :
    $secret = 'removed';
    $sso->setSecret( $secret );

    // charger le payload transmis par Discourse
    $payload = $_GET['sso'];
    $signature = $_GET['sig'];

    // valider le payload
    if (!($sso->validatePayload($payload,$signature))) {
        // invalide, refuser
        header("HTTP/1.1 403 Forbidden");
        echo("Mauvaise requête SSO");
        die();
    }

    $nonce = $sso->getNonce($payload);

    // Insérez ici votre code d'authentification utilisateur ...

    // Requis et doit être unique à votre application
    $userId = $myu->id;
    // Requis et doit être cohérent avec votre application
    $userEmail = $myu->email;

    // Optionnel - si vous ne définissez pas ces valeurs, Discourse générera des suggestions
    // basées sur l'adresse e-mail

    $extraParameters = array(
        'username' => $myu->username,
        'name'     => $myu->username
    );

    // construire la chaîne de requête et rediriger vers le site Discourse
    $query = $sso->getSignInString($nonce, $userId, $userEmail, $extraParameters);
    header('Location: http://forum.bloxplays.com/session/sso_login?' . $query);
    exit(0);
    ?>

Consultez ce sujet pour vérifier si votre code SSO effectue toutes les opérations nécessaires : Single-Sign-On officiel pour Discourse (sso).

Si vous activez le paramètre du site journalisation détaillée du SSO, des informations supplémentaires sur les demandes de connexion SSO s’afficheront dans les journaux d’erreurs de votre site. Pour consulter vos journaux d’erreurs, allez dans Admin / Journaux et cliquez sur l’entrée “Journaux d’erreurs” dans le menu de navigation administrateur. Les entrées de journal pertinentes commenceront par le texte “Journal SSO détaillé.” Si vous remarquez des erreurs dans les journaux qui ne sont pas claires, n’hésitez pas à les publier ici.