Похоже, что что-то настроено неправильно. Возможно, стоит отступить на шаг назад. У меня сейчас в локальной среде не настроен провайдер SSO, но это может помочь вам продвинуться вперёд.
В Discourse убедитесь, что настроены следующие параметры:
Параметр discourse connect url должен быть установлен в URL, который обрабатывает код, который вы опубликовали.
Параметр discourse connect secret установите в строку текста длиной не менее 10 символов. Обратите внимание, что в опубликованном вами коде жёстко прописана строка keyhere длиной всего 7 символов. Предполагаю, что при запуске кода вы меняете это значение. Установите его в то же значение, которое вы ввели в Discourse.
Теперь выйдите из своего сайта Discourse. Откройте вкладку «Network» (Сеть) в веб-инспекторе вашего браузера. Нажмите кнопку «Login» (Войти) на Discourse. Вы должны увидеть запросы, похожие на первые два запроса на скриншоте ниже:
Первый запрос будет по адресу http://forum.example.com/session/sso?return_path=%2F.
Следующий запрос должен быть по адресу https://example.com/?sso=<sso_payload_sent_from_discourse>&sig=<sso_signature>.
example.com и forum.example.com должны быть заменены на фактические домены, которые вы используете.
Если всё настроено правильно, я ожидаю, что это присвоит значения параметров sso и sig переменным, которые вы установили здесь:
$sso = $_GET['sso'];
$sig = $_GET['sig'];
Если бы это был я, я бы, вероятно, закомментировал остальную часть кода и просто подтвердил бы, что вы можете получать полезную нагрузку и присваивать её переменным.
С включённым DiscourseConnect вы можете снова войти на свой сайт Discourse, перейдя по маршруту /u/admin-login. Если у вас есть доступ к консоли Rails сайта Discourse, вы также можете снова войти, отключив DiscourseConnect из консоли Rails:
SiteSetting.enable_discourse_connect = false
Возможно, в коде, который вы опубликовали, есть ошибки ниже по ходу выполнения. Например, я думаю, что вам нужно вызвать urldecode для значения параметра sso перед генерацией ожидаемой сигнатуры. Посмотрите, как это обрабатывает плагин WP Discourse:
$payload в функции выше — это просто значение параметра запроса sso после его очистки здесь: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

