看起来配置不正确。也许可以退一步看看。我现在本地设置没有配置SSO提供商站点,但这或许能帮到你一部分。
在 Discourse 中,请确保配置了以下设置:
discourse connect url 设置应为处理你已发布代码的URL。
discourse connect secret 设置应为一个至少10个字符的字符串。请注意,你已将7个字符的字符串 keyhere 硬编码到你已发布的代码中。我假设你在运行代码时会更改该值。将其设置为你在 Discourse 上输入的值。
现在注销你的 Discourse 站点。打开浏览器的 Web 检查器到其网络选项卡。点击 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'];
如果是我,我可能会注释掉其余代码,只确认你能接收到 payload 并将其分配给变量。
启用 DiscourseConnect 后,你可以通过访问 /u/admin-login 路由重新登录你的 Discourse 站点。如果你可以访问 Discourse 站点的 Rails 控制台,你也可以通过在 Rails 控制台中禁用 DiscourseConnect 来重新登录:
SiteSetting.enable_discourse_connect = false
你已发布代码的其余部分可能存在错误。例如,我认为在生成预期的 sig 之前,你需要对 sso 参数的值调用 urldecode。看看 WP Discourse 插件是如何处理的:
上面函数中的 $payload 只是 sso 查询参数的值,在经过此处的清理后:wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub

