我正在尝试通过插件将 WordPress 用作 Discourse 的 SSO 提供商。当我在论坛站点上点击登录时,它会将我重定向到我的网站,并在 URL 后附加一个 SSO 参数,但显示的页面却是空白的。该插件是否应该读取该 URL 参数并执行某些操作,而目前这些操作失败了?我是否需要将其发送到网站上的特定路径?我不太清楚预期的行为是什么,因此不确定如何排查问题。我在服务器错误日志中也没有看到任何错误。
您的网站是否使用默认的 WordPress 登录页面 /login.php?如果不是,您可能需要在“登录页面路径”选项中添加相应路径(该选项位于 WP Discourse SSO 提供者标签页中)。
您的网站上是否安装了 WooCommerce?
它没有使用默认值,我已经在字段中指定了。仍然没有成功,只显示空白页面。
而且,没有 WooCommerce。
所以,我想可能是我对工作原理的理解有误,或者还需要做一些额外的修改。在测试中我意识到,如果我已经登录了网站,那么一切正常。但我的预期是,如果尚未登录,系统应启动登录流程,但这似乎并未发生。基于此,我有几个后续问题:
- Discourse 的登录重定向本应将用户发送到我的网站的 /?sso=abcd1235… 还是 /sign-in/?sso=abcd1235…(包含我自定义的登录路径)?目前它使用的是 /。
- 是否期望我的自定义登录代码在重定向回我的网站时保留 sso URL 参数,并在用户登录后将其包含在重定向中,以便建立 sso 连接?
我刚刚意识到,它使用的是 WordPress 用户名作为 Discourse 用户名。在我们的情况下,需要使用 WordPress 中的昵称,因为用户名是基于第三方身份验证提供商生成的哈希值。所以这可能是一条死胡同。
是的。在 Discourse 上点击“登录”按钮后,用户将被重定向到您在 Discourse 中设置的 sso url。这应该是您网站的首页 URL。
如果您尚未登录 WordPress,SSO 代码会将您重定向到您网站的登录 URL。该 URL 默认为 /wp-login.php。您可以通过设置“登录页面路径”选项来覆盖此设置。登录后,用户应被重定向回您网站的首页 URL,同时保留从 Discourse 发送的查询参数。
如果当您尚未登录 WordPress 时此功能无法正常工作,问题可能是您的网站设置了登录重定向,覆盖了 WP Discourse SSO 代码设置的登录重定向。另一种可能性是,您的网站登录代码会剥离 Discourse 设置的查询参数。
您可以使用 wpdc_sso_params 过滤器来覆盖插件设置的用户名:
add_filter( 'wpdc_sso_params', 'wpdc_custom_sso_params', 10, 2 );
function wpdc_custom_sso_params( $params, $user ) {
$params['username'] = $user->user_nicename;
return $params;
}
有关详细运作机制,请参阅 https://github.com/discourse/wp-discourse/blob/master/lib/sso-provider/discourse-sso.php。
我刚才查看了插件代码,找到了可以修改的地方。使用覆盖(override)确实是更好的方法,谢谢!我会检查一下我的自定义登录代码,看看它是否在某个地方干扰了该流程。这非常有帮助,再次感谢。