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('لم يتم العثور على عنوان 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 الخاص بك يقوم بكل ما هو مطلوب منه: Single-Sign-On الرسمي لـ Discourse (sso).

إذا قمت بتفعيل إعداد الموقع “تسجيل SSO التفصيلي” (verbose sso logging)، فستظهر تفاصيل إضافية حول طلبات تسجيل الدخول عبر SSO في سجلات الأخطاء الخاصة بموقعك. لعرض سجلات الأخطاء، انتقل إلى Admin / Logs ثم انقر على مدخل “Error Logs” من قائمة التنقل الخاصة بالإدارة. ستبدأ مدخلات السجل ذات الصلة بالنص “Verbose SSO log.”. إذا لاحظت أخطاء في السجلات غير واضحة، فلا تتردد في نشرها هنا.

إعجابَين (2)