# SSO non funziona per me

**URL:** <https://meta.discourse.org/t/sso-isnt-working-for-me/159807>\
**Category:** SSO\
**Created:** [4 Agosto 2020, 6:24pm UTC](https://meta.discourse.org/t/sso-isnt-working-for-me/159807 "2020-08-04T18:24:52Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![jakedev](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jakedev/32/180825_2.png) [@jakedev](https://meta.discourse.org/u/jakedev)\
**Post date:** [4 Agosto 2020, 6:24pm UTC](https://meta.discourse.org/t/sso-isnt-working-for-me/159807/1 "2020-08-04T18:24:52Z")

</div>

Sto avendo problemi con il mio SSO, dice che non c’è external\_id.

PHP:

```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 trovato nel 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 di ritorno SSO non trovato nel 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();

    // questo dovrebbe essere lo stesso nel tuo codice e nelle impostazioni di Discourse:
    $secret = 'removed';
    $sso->setSecret( $secret );

    // carica il payload passato da Discourse
    $payload = $_GET['sso'];
    $signature = $_GET['sig'];

    // valida il payload
    if (!($sso->validatePayload($payload,$signature))) {
        // non valido, nega l'accesso
        header("HTTP/1.1 403 Forbidden");
        echo("Richiesta SSO errata");
        die();
    }

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

    // Inserisci qui il tuo codice di autenticazione dell'utente ...

    // Obbligatorio e deve essere unico per la tua applicazione
    $userId = $myu->id;
    // Obbligatorio e deve essere coerente con la tua applicazione
    $userEmail = $myu->email;

    // Opzionale - se non imposti questi, Discourse genererà suggerimenti
    // basati sull'indirizzo email

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

    // costruisci la stringa di query e reindirizza al sito Discourse
    $query = $sso->getSignInString($nonce, $userId, $userEmail, $extraParameters);
    header('Location: http://forum.bloxplays.com/session/sso_login?' . $query);
    exit(0);
    ?>

```

---

_[View the full topic](https://meta.discourse.org/t/sso-isnt-working-for-me/159807)._
