SSOが機能しません

SSO に問題が発生しています。「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 が見つかりません');
            }

            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('ペイロードに return_sso_url が見つかりません');
            }

            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();

    // これはコード内と Discourse の設定内で同じである必要があります:
    $secret = 'removed';
    $sso->setSecret( $secret );

    // Discourse から渡されたペイロードを読み込みます
    $payload = $_GET['sso'];
    $signature = $_GET['sig'];

    // ペイロードを検証します
    if (!($sso->validatePayload($payload,$signature))) {
        // 無効なため拒否します
        header("HTTP/1.1 403 Forbidden");
        echo("不正な SSO リクエストです");
        die();
    }

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

    // ここにユーザー認証コードを挿入してください...

    // 必須であり、アプリケーション固有で一意である必要があります
    $userId = $myu->id;
    // 必須であり、アプリケーションと整合している必要があります
    $userEmail = $myu->email;

    // オプション - これらを設定しない場合、Discourse はメールアドレスに基づいて
    // 提案を生成します

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

    // クエリ文字列を構築し、Discourse サイトへリダイレクトします
    $query = $sso->getSignInString($nonce, $userId, $userEmail, $extraParameters);
    header('Location: http://forum.bloxplays.com/session/sso_login?' . $query);
    exit(0);
?>

このトピックを確認して、SSO コードが必要な処理をすべて行っているかご確認ください: 公式 Discourse 向けシングルサインオン (SSO)

verbose sso logging サイト設定を有効にすると、SSO ログインリクエストに関する詳細情報がサイトのエラーログに表示されます。エラーログを表示するには、[管理] / [ログ] に移動し、管理ナビゲーションメニューから「エラーログ」エントリをクリックします。関連するログエントリは「Verbose SSO log.」というテキストで始まります。ログに不明なエラーが表示された場合は、こちらに投稿してください。

「いいね!」 2