# 使用WP Discourse和DiscourseConnect配置单点登录（SSO）

**URL:** https://meta.discourse.org/t/configure-single-sign-on-sso-with-wp-discourse-and-discourseconnect/223494
**Category:** Administrators
**Tags:** sso, wordpress, video, discourseconnect, how-to
**Created:** [2022年四月6日 13:15 UTC](https://meta.discourse.org/t/configure-single-sign-on-sso-with-wp-discourse-and-discourseconnect/223494 "2022-04-06T13:15:15Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2022年四月6日 13:15 UTC](https://meta.discourse.org/t/configure-single-sign-on-sso-with-wp-discourse-and-discourseconnect/223494/1 "2022-04-06T13:15:15Z")

</div>

[WP Discourse](https://github.com/discourse/wp-discourse) 插件允许您在 WordPress 中设置 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)，这样您的用户既可以使用 WordPress 账户登录 Discourse，也可以使用 Discourse 账户登录 WordPress。在设置 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 之前，您首先需要在 WordPress 上安装 [WP Discourse](https://github.com/discourse/wp-discourse) 插件，并将其与您的 Discourse 连接。如果您已准备好开始，请先观看这段简短的视频，或按照下方的说明操作。

https://www.loom.com/embed/9ae65a956a4d49a283798e3f441ec558

## 下一步

设置好 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 后，您可能还想查看以下主题：

- [将 WordPress 帖子发布到 Discourse](https://meta.discourse.org/t/wp-discourse-and-publishing-posts-to-discourse/223492/1)
- [使用 Discourse 作为 WordPress 评论系统](https://meta.discourse.org/t/wp-discourse-and-commenting/223493/1)

* * *

## 操作说明

### 设置密钥

无论您是将 [WP Discourse](https://github.com/discourse/wp-discourse) 设置为 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 的提供者（Provider）还是客户端（Client），都需要设置一个密钥。进入「[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 密钥」选项卡，输入一段文本（允许包含数字、字母和符号），长度至少为 10 个字符。创建此密钥时请遵循与创建强密码相同的规则。完成后请务必保存。

然后，打开您的 Discourse 站点设置（在管理面板中），搜索「[discourse connect](https://meta.discourse.org/t/13045?silent=true)」。顶部附近的设置中会有一项为 `discourse connect secret`。将您在 [WP Discourse](https://github.com/discourse/wp-discourse) 中设置的密钥粘贴到此处，然后点击绿色对勾。

### 使用 WordPress 登录 Discourse（[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者）

> 在遵循以下说明之前，请确保您的 [WP Discourse](https://github.com/discourse/wp-discourse) 已连接到 Discourse，并且密钥已设置（☝）

若要允许用户使用其 WordPress 账户凭据登录 Discourse，您需要将 [WP Discourse](https://github.com/discourse/wp-discourse) 设置为 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者。进入 [WP Discourse](https://github.com/discourse/wp-discourse) 设置中的 `DiscourseConnect Provider` 选项卡，选中 `Enable DiscourseConnect Provider` 复选框并保存设置。

接下来，进入您的 Discourse 站点设置，在搜索框中输入「[discourse connect](https://meta.discourse.org/t/13045?silent=true)」以查看所有 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 设置。首先，将 `discourse connect url` 设置为您的 WordPress 网址。最后一步是选择 `enable discourse connect`。在选中此选项前请确保已做好准备，因为一旦启用，您的用户将只能通过 WordPress 登录 Discourse。

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

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

#### 电子邮件验证

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

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

#### 移除 `require_activation` 标志

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

```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` 标志，请使用类似以下内容：

```php
// 将 '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](https://meta.discourse.org/t/13045?silent=true) 提供者选项中的「在登录时创建或同步 Discourse 用户」来自动填充 Discourse 名称字段。

当 WordPress 作为 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者时，可以使用「更新用户数据」Webhook（在「Webhooks」设置面板中）。该 Webhook 会自动填充 WordPress 中用户的 Discourse 名称字段。

#### 创建 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 登录链接

如果您已启用 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者选项，可以通过创建具有以下结构的链接，将 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 登录链接添加到您的 WordPress 网站：

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

```

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

### 使用 Discourse 登录 WordPress（[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 客户端）

若要启用您的站点作为 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 客户端，请点击 `DiscourseConnect Client` 选项卡。在该页面中，选择 `Enable DiscourseConnect Client` 和 `Add Login Link` 选项。

现在进入您的 Discourse 管理/设置页面，搜索「[discourse connect](https://meta.discourse.org/t/13045?silent=true)」以查看所有 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 选项。

- 选择「enable [discourse connect](https://meta.discourse.org/t/13045?silent=true) provider」设置
- 将您的 `DiscourseConnect Secret Key` 从 WordPress 复制到 Discourse 的「[discourse connect](https://meta.discourse.org/t/13045?silent=true) provider secrets」设置的「secret」字段中。在该设置的「domain」字段中输入您的 WordPress 网站域名。然后点击绿色对勾保存设置。

完成后，Discourse 上的「[discourse connect](https://meta.discourse.org/t/13045?silent=true) provider secrets」设置应如下所示（域名设置为您的 WordPress 域名）：

 ![](https://global.discourse-cdn.com/meta/original/3X/8/2/82659d0e798ad365af992d79e897a33aa8a5eda0.png)

现在 Discourse 应已作为您 WordPress 网站的 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者运行。

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

**注意** ：此行为仅影响在 WordPress 和 Discourse 上均已有账户的用户。通过 Discourse [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 创建的新 WordPress 账户在首次点击「使用 Discourse 登录」链接时将能够自由登录 WordPress。为了使在 WordPress 网站和 Discourse 论坛上均已有账户的用户更容易通过 Discourse 登录，请在 `DiscourseConnect Client` 选项卡上选中 `Sync Existing Users by Email` 复选框。

### 同步 Discourse 登出

启用 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 后，可以通过将站点的 `home_url` 与查询参数 `request=logout` 添加到 Discourse 站点设置中的 `logout redirect` 来实现从 Discourse 登出与 WordPress 站点的同步。该设置位于 `/admin/site_settings/category/users` 的 Discourse 设置部分。以下是「logout redirect」URL 的示例：

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

```

### 故障排除

如果您在使用 WordPress 作为论坛的 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 提供者时遇到问题，首先应检查以下内容：

- WordPress 和 Discourse 上设置的 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 密钥是否一致
- 确保已在 WordPress 网站上选中 `Enable DiscourseConnect Provider`
- 确保已在 Discourse 中输入了正确的 `discourse connect url`

#### 使用 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 时出现「登录错误」

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

[https://meta.discourse.org/t/debugging-and-fixing-common-discourseconnect-issues/103496。](https://meta.discourse.org/t/debugging-and-fixing-common-discourseconnect-issues/103496%E3%80%82)

#### 禁用 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)

如果 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 无法正常工作，您可以通过禁用 `enable discourse connect` 站点设置将其关闭。如果您尚未在任何地方登录管理员账户以关闭它，请不要担心，有几种方法可以重新进入并关闭它。

##### 通过 /users/admin-login 登录

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

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

```

您应该会看到一个输入框，要求您输入管理员电子邮件。提交电子邮件后，您将收到一封包含链接的电子邮件，该链接允许您直接登录管理员账户。然后，您可以进入站点设置并禁用 `enable discourse connect` 以关闭 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)。

如果此方法因某种原因无效，请不要担心，您仍然可以通过服务器的控制台关闭 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)（👇）

##### 通过服务器控制台关闭 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)

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

```plaintext
cd /var/discourse
./launcher enter app
rails c
SiteSetting.enable_discourse_connect=false
exit
exit

```

---

_[View the full topic](https://meta.discourse.org/t/configure-single-sign-on-sso-with-wp-discourse-and-discourseconnect/223494)._
