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 not found in 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('Return SSO URL not found in 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();

    // 이 값은 코드와 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("Bad SSO request");
        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 코드가 필요한 모든 작업을 수행하는지 확인해 보세요: Official Single-Sign-On for Discourse (sso).

verbose sso logging 사이트 설정을 활성화하면 SSO 로그인 요청에 대한 추가 세부 정보가 사이트의 에러 로그에 표시됩니다. 에러 로그를 보려면 관리자 / 로그로 이동하여 관리자 탐색 메뉴에서 “Error Logs” 항목을 클릭하세요. 관련 로그 항목은 "Verbose SSO log."라는 텍스트로 시작됩니다. 로그에서 이해하기 어려운 오류를 발견하면 이곳에 자유롭게 게시해 주세요.