在不使用 DiscourseConnect 时填写 discourse_username

这是 GitHub 上一个旧 issue 中的一个问题,在这里元上跟踪起来更方便

https://github.com/discourse/wp-discourse/issues/237

来自 @mattdm

我们正在使用 OpenID 进行登录,而且似乎只有在使用 DiscourseConnect 时才提供此选项。还有其他方法吗?手动填写非常麻烦。

我们确实允许用户在 Discourse 网站上编辑他们的电子邮件地址(与 SSO 不同),但用户 ID 保证是相同的。

我的初步回应(问题仍未解决)

@mattdm,你能澄清几件事吗:

  1. 用户在 WordPress 和 Discourse 上的账户之间的电子邮件可能不同吗?
  2. 你说的“用户 ID 保证是相同的”是什么意思?我们说的是哪个用户 ID?
2 个赞

哦,抱歉——我确信我之前已经回答过了,但我想……我没有?也许我只是想了想!总之:

  1. 电子邮件最初是从 SSO 同步到 WordPress 和 Discourse 的。但是,应广大用户的要求,我们允许用户更改 Discourse 中的电子邮件。(事实证明,用户经常希望将 Discourse 通知发送到与登录关联的电子邮件以外的地方。)也可以在 WordPress 中更改电子邮件地址,但我不知道有谁这样做过,甚至不知道该实例上的电子邮件发送功能是否正常工作。

  2. “用户 ID”是指“用户名”。用户名始终[^1]取自 Discourse 和 WordPress 的 SSO,用户无法更改。出于某种我不知道但当时可能很有意义的原因,在我们的 SSO 端是 nickname;这被映射到 oauth2 json username path

[^1]:实际上,有少数像我一样的账户是在我们拥有 SSO 之前设置的,它们是不正确的——我的是“Matthew Miller”,而不是 mattdm。但我们可以清理一下。

嗯,好的,所以实际上

  1. 您的用户中有一部分人在 WordPress 和 Discourse 上的电子邮件地址不同。
  2. 您的用户名保证与您的身份提供商为 WordPress 和 Discourse 提供的用户名相同。

如果我们能够将 WP Discourse 用户 webhook 与 DiscourseConnect 功能分离(这是可能的),那么用户匹配将基于电子邮件而不是用户名进行。您的情况在某种程度上特定于您的身份设置。

我认为这种情况最好通过在您的 WordPress 上进行自定义编码来处理。您想要的是类似这样的:

function update_discourse_username( $user_login, $user ) {
    update_user_meta( $user->ID, 'discourse_username', $user_login );
}
add_action( 'wp_login', 'update_discourse_username', 10, 2);

基本上,在登录后将 discourse_username 元字段分配给 WP 用户名,因为它们保证是相同的。请注意,“user_login”在 WordPress 代码中有时被称为“username”。

几年后重新回到这个问题。 :slight_smile:

不知何时,我们更改了设置,现在电子邮件地址会从我们的(oauth2)SSO 中强制同步。所以,我们应该能够通过这种方式进行匹配。(而且,即使出于某种原因存在不匹配,也不应该出现电子邮件属于“其他人”的情况,所以最坏的情况也就是失败,对吧?)

有没有可能让 WP Discourse 用户 webhook 能够“开箱即用”?

如果不行……我不是 WordPress 专家,而且我们的 WordPress 是托管的,所以我不太确定我们是否有简单的方法来自定义插件。

抄送 @jwheel

好的,只是为了澄清

这种情况现在不再发生了吗?

只是想说明一下,它目前是可以正常工作的。您是在要求一项新功能 :slight_smile:

此外,您要求的新功能需要非常仔细地考虑。我知道几年前我说过这是可能的,但目前我有点担心将其作为插件的核心功能,因为这样的功能必须假定电子邮件地址在 WordPress 上得到了正确验证,但这不一定是一个安全的假设。

(WordPress 电子邮件验证)是网站管理员的责任,但开源开发的一个原则是避免创建在部分(即使是小部分)情况下会导致不良后果的东西,前提是您无法控制环境。当它仅限于 DiscourseConnect 时,这个问题仍然存在,但得到了缓解。

我将更仔细地考虑一下,本周晚些时候给您回复。

1 个赞

如果电子邮件匹配过于复杂,我觉得“Discourse 用户名始终与 WordPress 匹配(反之亦然)”可能并不少见。

即使某人没有假定唯一用户名的 SSO 系统,肯定也有许多小型网站,例如拥有几十个 WordPress 用户,并且这种情况是约定俗成的。

对此有一个现成的解决方案。Discourse 可以配置为 WordPress 的 DiscourseConnect 提供商(与通常的配置相反)。设置起来很简单。启用后,有一个可选设置允许根据用户的电子邮件地址同步 WordPress/Discourse 帐户。

甚至还有一个链接添加到用户的个人资料页面:


(编辑:能否在没有 AI 的情况下为图片添加字幕?)

现在正在测试,点击个人资料页面上的链接没有填写 Discourse 用户名字段。它应该填写。点击可以添加到登录页面上的“使用 Discourse 登录”链接导致 Discourse 用户名字段自动更新。

我认为同步帐户的目的是以安全的方式更新 Discourse 用户名字段,所以这可能值得看看是怎么回事。还有一个问题是,WordPress 上电子邮件地址“未经验证”的帐户被允许与 Discourse 同步其帐户。默认情况下可能不应允许这样做。

对于您的情况,您可能不希望允许用户通过 Discourse 登录 WordPress。应该可以通过个人资料页面上的链接来允许用户同步他们的帐户,以便自动填写他们的 Discourse 用户名字段。您不必启用通过 Discourse 登录 WordPress 即可实现此目的。

这种方法的一个潜在缺点是用户必须主动进行。它不会提供一个管理员可以点击以获取用户 Discourse 用户名的按钮。

这似乎很愚蠢。我们_有_一个集中的SSO。我们不应该配置一些服务来使用其他随机服务作为身份验证提供商,才能让它们协同工作。这会让人抓狂。

不要被名称(DiscourseConnect)所迷惑。如果我描述的功能按预期工作,它只会是一种让 WordPress 用户确认他们拥有一个 Discourse 帐户且电子邮件地址匹配,并在 WordPress 上自动填写其 Discourse 用户名的方式。它不会影响您网站的身份验证系统。

核心插件中永远不会有 WordPress 用户名与 Discourse 用户名匹配的身份机制,即使在设置后面也是如此。在此背景下唯一可能的是电子邮件匹配。我已决定将电子邮件匹配添加为用户 webhook 的备用机制。它将在下一个版本中推出,该版本将在几周内发布。

1 个赞

为了完成此事的闭环,插件的最新版本 2.5.4 包含对 Webhooks 的各种更新,包括删除“按电子邮件匹配用户”设置的 DiscourseConnect 要求。请参阅

1 个赞

我认为这至少能在 99% 的情况下解决我们的问题。谢谢!!!

@jwheel 供您参考,我已经在我方网站上启用了此功能。

2 个赞

太棒了,我会关注该插件的未来主题。

2 个赞