DC SSO 连接失败导致管理员因超时而变慢

我设置了 Discourse Connect SSO,使用了官方插件,这样我的 WP 用户就可以登录 Discourse,而无需在那里注册另一个用户。一切正常,但每次访问 WP 后台(管理区域)的请求都会因超时而延迟 10 秒,我仅通过 Query Monitor 插件发现了这个问题。

https://{our-forum-address}/site.json cURL 错误 28:连接在 10001 毫秒后超时

WPDiscourse\Admin\MetaBox->discourse_request()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:516
WPDiscourse\Admin\MetaBox->get_discourse_categories()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:273
WPDiscourse\Admin\MetaBox->setup_options()
wp-content/plugins/wp-discourse/admin/meta-box.php:49
do_action(‘admin_init’)
wp-includes/plugin.php:517

插件:wp-discourse

即使它有效,为什么需要这样的调用?我该如何禁用它?

论坛和网站在不同的服务器上。没有 Cloudflare。SSL 是 letsencrypt。它在暂存环境中没有这个问题。我迁移到生产环境,创建了新的 API 密钥和密钥,试图解决这个问题但没有成功。

插件显示 您未连接到 Discourse。请检查您的连接设置是否正确。如果问题仍然存在,请启用连接日志并检查日志。 …但我确实连接了,因为用户可以通过点击包含其地址的链接无缝登录论坛。

WP 中的日志显示:

[2024-10-31 10:54:47] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"从 Discourse 返回了无效的响应","http_code":"","http_body":""}

我曾认为奇怪的 WP 安全设置会阻止它,所以我添加了这个但也没有用:

add_filter('http_request_host_is_external', [$this, 'mark_discourse_api_url_external'], 10, 3);

function mark_discourse_api_url_external($is_external, $host, $url)
{
    if ($host === "{our-forum-address}") {
        return true; // 通过指示主机是外部的来允许请求
    }

    return $is_external;
}

@Firsh

对您 /site.json 的调用是 WordPress 插件检索有关您的 Discourse 信息所必需的。

这意味着您没有正确连接,即使事情看起来正常,我也不会指望它们会一直正常工作。

这是我们需要关注的。您能否分享您创建的密钥类型?供参考,请确保您遵循有关此处的指南:

2 个赞

我认为问题不在于密钥。我之前尝试过使用暂存站点的密钥,而新的密钥显示“从未使用过”。当我尝试使用 wp_remote_request 调用我的论坛主页时,也会超时。我将其设置为“每个用户”和“全局”。

是的,但为什么在所有不相关的管理页面上都要一直调用呢?只需要在需要时调用一次就足够了。我追踪到了它的来源,是 function get_discourse_categories(),并且它被硬编码到 add_action( 'admin_init', array( $this, 'setup_options' ) ); 中。我不希望我的 WP 了解论坛的分类,我没有使用任何发布/评论功能,我只需要登录,而登录已经可以正常工作了。

我还使用 wp_remote_request() 向论坛主页发出了请求,但同样会超时。其他随机站点都可以访问。

我明白您觉得 /site.json 的请求是不必要的,但是如果无法成功连接到您的 Discourse,WordPress 插件将无法可靠地为您工作,所以我们应该找出原因。\n\n1. 您能想到您的暂存环境和生产环境之间还有其他区别吗?\n2. 您能否分享您暂存和生产实例的 WP Discourse 日志元文件?\n3. 您能否分享您的 WordPress 和 Discourse 实例的链接?

1 个赞

是的,但这是一个匈牙利语的私人会员制网站和论坛。

论坛:https://forum.intelligensbefektetok.hu/
网站:https://intelligensbefektetok.hu/

我的暂存环境是手动创建的精确副本,尽管运行在虚拟机中的 Docker 中。生产环境不由我管理,我也不知道它是什么类型的托管,但我们以前从未遇到过任何问题,而且它之前速度很快。

我刚才尝试了:

  • discourse_request 函数中的 sslverify = false 选项
  • 并在我的另一个域上创建了一个 Cloudflare 的 CNAME(别名),将其指向论坛的托管服务器(“更好的”SSL,并且托管服务器不同,以排除实时站点托管防火墙中的某种回环限制):https://ibkforum.stateofbliss.us,但它仍然超时,而从暂存环境测试请求则工作正常。未登录时,它会重定向到主站点。
  • 我正在使用这个小插件来检查请求:https://wphive.com/plugins/wp-remote-request-check/
> object(WP_Error)#5757 (3) { ["errors"]=> array(1) { ["http_request_failed"]=> array(1) { [0]=> string(59) "cURL error 28: Connection timed out after 5000 milliseconds" } } ["error_data"]=> array(0) { } ["additional_data":protected]=> array(0) { } }
  • 其他 WordPress 网站;这个论坛;实时站点在向自身发出请求时,都工作正常。

暂存环境 WordPress 的日志:

[2024-10-31 13:09:08] connection.INFO: check_connection_status.valid_scopes
[2024-10-31 13:09:19] connection.INFO: check_connection_status.successful_connection
[2024-10-31 13:09:19] connection.INFO: check_connection_status.valid_scopes

生产环境日志与我在 OP 中的相同:

[2024-10-31 13:12:32] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}

直接在浏览器中加载时,此链接可以正常工作:
https://forum.intelligensbefektetok.hu/site.json

另外,感谢您的帮助。

您是指 WordPress 生产环境还是 Discourse 生产环境?您的 Discourse 生产环境中是否有某些东西在执行重定向和/或更改(或剥离)请求中的标头?

如果您能分享这两个实例的元文件,那将会有所帮助。请在“日志”管理面板中点击“查看元文件”。

这可能是根本问题。如果您的 WordPress 完全无法访问您的 Discourse,连接将无法工作。如果您能够轻松测试此连接性,我建议您在对论坛的网络层进行任何调整时继续进行此测试,直到您收到 403(即未经授权)为止。

我的直觉是这是一个网络层问题,可能是重定向或防火墙。

没有预演的 Discourse,两个站点都使用相同的实时 Discourse(相同的用户 ID 等)。我在另一个帖子中问过这个问题,应该没问题。论坛的网络层非常简单,托管在 Hetzner 上,在 VPS 中使用官方 Docker,论坛几乎没有使用或自定义过,除了视觉方面。我不知道有什么设置会阻止它被访问。我已联系 WP 托管公司创建一个工单,看看他们是否能找出连接失败的原因,因为我更担心他们不寻常的设置。

对我来说有趣的是,仅仅是论坛可以访问 WP(而不是反过来)就“足够”实现有效的 SSO。除了注销论坛用户之外。

日志(实时站点下载了一个 0 字节的 ZIP)。

是的,我也会先等待这个结果,否则我们可能会在这里白费力气。基本问题是为什么标准的 WP 请求无法连接到您的论坛。