使用WP Discourse和DiscourseConnect配置单点登录(SSO)

WP Discourse 插件允许您在 WordPress 中设置 DiscourseConnect,这样您的用户既可以使用 WordPress 账户登录 Discourse,也可以使用 Discourse 账户登录 WordPress。在设置 DiscourseConnect 之前,您首先需要在 WordPress 上安装 WP Discourse 插件,并将其与您的 Discourse 连接。如果您已准备好开始,请先观看这段简短的视频,或按照下方的说明操作。

下一步

设置好 DiscourseConnect 后,您可能还想查看以下主题:


操作说明

设置密钥

无论您是将 WP Discourse 设置为 DiscourseConnect 的提供者(Provider)还是客户端(Client),都需要设置一个密钥。进入「DiscourseConnect 密钥」选项卡,输入一段文本(允许包含数字、字母和符号),长度至少为 10 个字符。创建此密钥时请遵循与创建强密码相同的规则。完成后请务必保存。

然后,打开您的 Discourse 站点设置(在管理面板中),搜索「discourse connect」。顶部附近的设置中会有一项为 discourse connect secret。将您在 WP Discourse 中设置的密钥粘贴到此处,然后点击绿色对勾。

使用 WordPress 登录 Discourse(DiscourseConnect 提供者)

在遵循以下说明之前,请确保您的 WP Discourse 已连接到 Discourse,并且密钥已设置(:point_up:

若要允许用户使用其 WordPress 账户凭据登录 Discourse,您需要将 WP Discourse 设置为 DiscourseConnect 提供者。进入 WP Discourse 设置中的 DiscourseConnect Provider 选项卡,选中 Enable DiscourseConnect Provider 复选框并保存设置。

接下来,进入您的 Discourse 站点设置,在搜索框中输入「discourse connect」以查看所有 DiscourseConnect 设置。首先,将 discourse connect url 设置为您的 WordPress 网址。最后一步是选择 enable discourse connect。在选中此选项前请确保已做好准备,因为一旦启用,您的用户将只能通过 WordPress 登录 Discourse。

在 Discourse 中启用 DiscourseConnect 后,为确保设置正确,请在浏览器中打开一个无痕窗口。请保持正常的(非无痕)浏览器窗口登录管理员账户(以防万一出现问题需要改回设置)。在无痕窗口中,您会注意到 Discourse 的「注册」按钮不再显示。点击「登录」按钮。您应该会看到 WordPress 登录界面。输入您的 WordPress 凭据进行登录。随后您将被重定向回 Discourse 并成功登录。

如果出现任何问题,或您发现某些地方不太对劲,请返回正常浏览器窗口并禁用 enable discourse connect,以允许用户正常登录 Discourse。如果您因某种原因在正常浏览器窗口中不再登录管理员账户,请查看下方「故障排除」部分中的「通过 Discourse 控制台禁用 DiscourseConnect」章节以重新获取访问权限。

电子邮件验证

Discourse 期望所有用户的电子邮件地址都已验证,而 WordPress 并不强制用户验证电子邮件地址。在默认的 WordPress 设置中,在注册过程中验证用户电子邮件地址相对容易,但如果网站使用了创建前端注册表单的插件(例如,可通过 WooCommerce 添加的注册表单),WP Discourse 插件将无法验证用户的电子邮件。

如果用户的电子邮件在 WordPress 中未得到验证,那么在 WordPress 用户能够登录论坛之前,他们需要响应由 Discourse 发送的电子邮件验证通知。该插件提供了一些过滤器,可用于覆盖此行为。请查看代码以获取详细信息,起点在此处:https://github.com/discourse/wp-discourse/blob/master/lib/sso-provider/discourse-sso.php#L277

移除 require_activation 标志

如果您确定 WordPress 正在验证电子邮件地址,您可以告知 Discourse 无需再次验证。若要完全移除 require_activation 标志,请将类似以下内容添加到您的 WordPress 中(例如,在主题的 functions.php 文件中):

// 将 'my_prefix' 替换为您网站的前缀。

add_filter( 'discourse_email_verification', 'my_prefix_discourse_email_verification' );
function my_prefix_discourse_email_verification( $require_activation ) {
    return false;
}

若要为特定用户移除 require_activation 标志,请使用类似以下内容:

// 将 'my_prefix' 替换为您网站的前缀。

add_filter( 'discourse_email_verification', 'my_prefix_discourse_email_verification', 10, 2 );
function my_prefix_discourse_email_verification( $require_activation, $user_id ) {
    $user = get_userdata( $user_id );
    if ( /* 针对 $user 测试的某些条件 */ ) {

        return true;
    }

    return false;
}

用户数据 Webhook

此 Webhook 的存在是由于历史原因——现在可以通过使用 DiscourseConnect 提供者选项中的「在登录时创建或同步 Discourse 用户」来自动填充 Discourse 名称字段。

当 WordPress 作为 DiscourseConnect 提供者时,可以使用「更新用户数据」Webhook(在「Webhooks」设置面板中)。该 Webhook 会自动填充 WordPress 中用户的 Discourse 名称字段。

创建 DiscourseConnect 登录链接

如果您已启用 DiscourseConnect 提供者选项,可以通过创建具有以下结构的链接,将 DiscourseConnect 登录链接添加到您的 WordPress 网站:

<a href="https://discourse.example.com/session/sso?return_path=/">社区</a>

return_path 的值设置为您希望用户最终到达的论坛页面。您可以通过在 WordPress 仪表盘的菜单部分将此结构的 URL 作为自定义链接添加,从而将 SSO 登录链接添加到 WordPress 菜单中。

使用 Discourse 登录 WordPress(DiscourseConnect 客户端)

若要启用您的站点作为 DiscourseConnect 客户端,请点击 DiscourseConnect Client 选项卡。在该页面中,选择 Enable DiscourseConnect ClientAdd Login Link 选项。

现在进入您的 Discourse 管理/设置页面,搜索「discourse connect」以查看所有 DiscourseConnect 选项。

  • 选择「enable discourse connect provider」设置
  • 将您的 DiscourseConnect Secret Key 从 WordPress 复制到 Discourse 的「discourse connect provider secrets」设置的「secret」字段中。在该设置的「domain」字段中输入您的 WordPress 网站域名。然后点击绿色对勾保存设置。

完成后,Discourse 上的「discourse connect provider secrets」设置应如下所示(域名设置为您的 WordPress 域名):

现在 Discourse 应已作为您 WordPress 网站的 DiscourseConnect 提供者运行。

在浏览器的无痕窗口中打开您的 WordPress 网站。当您现在访问登录页面时,应该在登录表单下方看到「使用 Discourse 登录」链接。点击它,您将被带到 Discourse 登录表单。在那里登录后,您将被重定向回 WordPress 登录页面,并显示一条通知,提示您需要将账户与 Discourse 同步。按照通知中的说明链接您的账户,之后您应该就能通过 Discourse 登录 WordPress 网站了。

注意:此行为仅影响在 WordPress 和 Discourse 上均已有账户的用户。通过 Discourse DiscourseConnect 创建的新 WordPress 账户在首次点击「使用 Discourse 登录」链接时将能够自由登录 WordPress。为了使在 WordPress 网站和 Discourse 论坛上均已有账户的用户更容易通过 Discourse 登录,请在 DiscourseConnect Client 选项卡上选中 Sync Existing Users by Email 复选框。

同步 Discourse 登出

启用 DiscourseConnect 后,可以通过将站点的 home_url 与查询参数 request=logout 添加到 Discourse 站点设置中的 logout redirect 来实现从 Discourse 登出与 WordPress 站点的同步。该设置位于 /admin/site_settings/category/users 的 Discourse 设置部分。以下是「logout redirect」URL 的示例:

http://example.com/?request=logout

故障排除

如果您在使用 WordPress 作为论坛的 DiscourseConnect 提供者时遇到问题,首先应检查以下内容:

  • WordPress 和 Discourse 上设置的 DiscourseConnect 密钥是否一致
  • 确保已在 WordPress 网站上选中 Enable DiscourseConnect Provider
  • 确保已在 Discourse 中输入了正确的 discourse connect url

使用 DiscourseConnect 时出现「登录错误」

如果用户在尝试登录 Discourse 时收到「登录错误」消息,请参阅:

https://meta.discourse.org/t/debugging-and-fixing-common-discourseconnect-issues/103496。

禁用 DiscourseConnect

如果 DiscourseConnect 无法正常工作,您可以通过禁用 enable discourse connect 站点设置将其关闭。如果您尚未在任何地方登录管理员账户以关闭它,请不要担心,有几种方法可以重新进入并关闭它。

通过 /users/admin-login 登录

打开新的浏览器窗口,在地址栏中输入您的论坛网址,后跟 /users/admin-login,例如:

https://community.mysite.com/users/admin-login

您应该会看到一个输入框,要求您输入管理员电子邮件。提交电子邮件后,您将收到一封包含链接的电子邮件,该链接允许您直接登录管理员账户。然后,您可以进入站点设置并禁用 enable discourse connect 以关闭 DiscourseConnect

如果此方法因某种原因无效,请不要担心,您仍然可以通过服务器的控制台关闭 DiscourseConnect:point_down:

通过服务器控制台关闭 DiscourseConnect

如果您不知道服务器控制台是什么,或者无法访问它,请联系您的托管服务提供商寻求帮助。在通过 SSH 连接到服务器后,您需要运行的命令如下:

cd /var/discourse
./launcher enter app
rails c
SiteSetting.enable_discourse_connect=false
exit
exit
11 个赞

我的 Discourse 没有这些选项怎么办? :confused:

@LosHunterros,欢迎来到 Meta!

Discourse Connect 不包含在基础托管计划中
Screenshot_20240507_204846_Chrome

4 个赞

谢谢你的回复

1 个赞

我现在需要非常基础的级别。或者简单的“是”或“否”。

我需要从 WordPress 轻松访问我的论坛,以便那些客户可以访问。因为他们在 WordPress 中创建了帐户,所以我将使用它作为提供商。

但我现在遇到了 Discourse 的 AI 问题。我了解到 DiscourseConnect 会劫持所有其他登录方式,例如 Google、Microsoft 和本地登录。但是,如果我设置了 discourse connect allowed redirect domains,AI 却非常确定事实并非如此。

好吧,我设置了。但仍然会重定向到 WordPress,而没有任何其他登录选项。

那么,我是在浪费生命中的两个小时,还是因为 AI 的幻觉,或者是我做错了什么?因为如果我一开始就猜对了,并且 DiscourseConnect 不允许其他登录方式,我会立即将其移除。在这个欧洲角落,没有 Google 登录是不可行的。

你的初步想法是正确的。AI 是错误的:详见

很遗憾,是的。

1 个赞

我已按照设置指南操作到单点登录(SSO)应该可以工作的阶段。当我在隐身窗口中访问我的 Discourse 站点时,我立即被重定向到我的 WordPress 首页,URL 中带有一个很长的查询字符串,并且没有可见的登录选项。

这是此阶段的预期行为吗?
我现在只需要完成 WordPress 端(登录/注册等)的构建,还是我配置错了什么?

嘿,迈克,欢迎。你应该被导向标准的 WordPress 登录页面。首先想到的是你的主题(或一个插件)提供了一个自定义的登录页面。你的登录页面通常是什么样子的?

嗨,Angus,谢谢!:slight_smile:

这是 WordPress 和 Discourse 的全新安装,启用了 Twenty Twenty-Five 主题。我一步一步地按照您的视频说明操作,但在隐身窗口中访问 Discourse 时,它会重定向到 WordPress 网站并停留在主题的主页上,而不是登录屏幕。

WordPress 网站目前处于目录隐私保护之下,因为它在一个开发环境中——这会影响重定向到正常登录页面吗?

嘿,Mike,这是我刚录制的一个小视频,展示了当前代码上的一个工作中的安装情况。

请将你的设置与我在视频中展示的进行核对,如果你确定设置方式相同但仍然无法工作,我们将通过排除法来确定原因。

1 个赞

你好 Angis,

非常感谢你制作那个视频,很棒的支持!

我提供了每个部分的截图(敏感信息已模糊处理)

image

image

image

在上面的截图中,这个实际上没有被选中(哎呀),但是,当我用隐身浏览器访问论坛时,它现在会自动重定向到 /wp-login.php - 我没有看到像你那样的论坛和登录按钮。

image

我不太在意它现在直接跳转到 wp-login 页面,但能够直接查看论坛总是一个额外的优势!

@angus 我弄明白了…… 在最初“我在做什么”的阶段,我用这个锁定了社区;

image

抱歉给您添麻烦了,这是启动模式 :dashing_away:

再次感谢您提供的超棒支持——我肯定还会回来的。

2 个赞

很高兴你弄明白了!

嗨,Angus,我想知道您是否能帮我解决我遇到的这个问题,我的主题没有得到任何回复:

基本上,如果我将用户匿名化,SSO 插件就会为他们创建一个新帐户。有没有办法单独禁用用户以阻止他们创建新帐户,并且当我对某人实施禁令或匿名化时,它能否自动同步?

也许可以匿名化用户,然后将他们的电子邮件地址设置为 SSO 邮箱。或者让 WordPress 禁止该用户(这似乎是真正的解决方案——WordPress 应该拒绝该用户)

我如何让 WordPress 禁止用户通过 SSO 登录?我认为这是解决方案。

这是一个 WordPress 的问题。:wink:

我查了下网络,看起来你可以将他们的角色更改为“本站无角色”。

我知道你的意思了,我希望用户能够继续使用网站,但不能创建论坛账户。

我们的论坛与网站是分开的,所以一些因扰乱秩序而被禁止使用社区的人仍然应该能够使用作为 SaaS 工具的网站。

那么我认为您需要在 Discourse 中暂停他们。如果您需要匿名化他们发布的内容,那么您需要先这样做,然后再创建被暂停的账户。

@Shauny 我已回复您的原始支持帖子:

1 个赞