angus
(Angus McLeod)
1
这是 GitHub 上一个旧 issue 中的一个问题,在这里元上跟踪起来更方便
https://github.com/discourse/wp-discourse/issues/237
来自 @mattdm:
我们正在使用 OpenID 进行登录,而且似乎只有在使用 DiscourseConnect 时才提供此选项。还有其他方法吗?手动填写非常麻烦。
我们确实允许用户在 Discourse 网站上编辑他们的电子邮件地址(与 SSO 不同),但用户 ID 保证是相同的。
我的初步回应(问题仍未解决)
嘿 @mattdm,你能澄清几件事吗:
- 用户在 WordPress 和 Discourse 上的账户之间的电子邮件可能不同吗?
- 你说的“用户 ID 保证是相同的”是什么意思?我们说的是哪个用户 ID?
2 个赞
mattdm
(Matthew Miller)
2
哦,抱歉——我确信我之前已经回答过了,但我想……我没有?也许我只是想了想!总之:
-
电子邮件最初是从 SSO 同步到 WordPress 和 Discourse 的。但是,应广大用户的要求,我们允许用户更改 Discourse 中的电子邮件。(事实证明,用户经常希望将 Discourse 通知发送到与登录关联的电子邮件以外的地方。)也可以在 WordPress 中更改电子邮件地址,但我不知道有谁这样做过,甚至不知道该实例上的电子邮件发送功能是否正常工作。
-
“用户 ID”是指“用户名”。用户名始终[^1]取自 Discourse 和 WordPress 的 SSO,用户无法更改。出于某种我不知道但当时可能很有意义的原因,在我们的 SSO 端是 nickname;这被映射到 oauth2 json username path。
[^1]:实际上,有少数像我一样的账户是在我们拥有 SSO 之前设置的,它们是不正确的——我的是“Matthew Miller”,而不是 mattdm。但我们可以清理一下。
angus
(Angus McLeod)
3
嗯,好的,所以实际上
- 您的用户中有一部分人在 WordPress 和 Discourse 上的电子邮件地址不同。
- 您的用户名保证与您的身份提供商为 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”。
mattdm
(Matthew Miller)
4
几年后重新回到这个问题。 
不知何时,我们更改了设置,现在电子邮件地址会从我们的(oauth2)SSO 中强制同步。所以,我们应该能够通过这种方式进行匹配。(而且,即使出于某种原因存在不匹配,也不应该出现电子邮件属于“其他人”的情况,所以最坏的情况也就是失败,对吧?)
有没有可能让 WP Discourse 用户 webhook 能够“开箱即用”?
如果不行……我不是 WordPress 专家,而且我们的 WordPress 是托管的,所以我不太确定我们是否有简单的方法来自定义插件。
抄送 @jwheel
angus
(Angus McLeod)
5
好的,只是为了澄清
这种情况现在不再发生了吗?
只是想说明一下,它目前是可以正常工作的。您是在要求一项新功能 
此外,您要求的新功能需要非常仔细地考虑。我知道几年前我说过这是可能的,但目前我有点担心将其作为插件的核心功能,因为这样的功能必须假定电子邮件地址在 WordPress 上得到了正确验证,但这不一定是一个安全的假设。
(WordPress 电子邮件验证)是网站管理员的责任,但开源开发的一个原则是避免创建在部分(即使是小部分)情况下会导致不良后果的东西,前提是您无法控制环境。当它仅限于 DiscourseConnect 时,这个问题仍然存在,但得到了缓解。
我将更仔细地考虑一下,本周晚些时候给您回复。
1 个赞
mattdm
(Matthew Miller)
6
如果电子邮件匹配过于复杂,我觉得“Discourse 用户名始终与 WordPress 匹配(反之亦然)”可能并不少见。
即使某人没有假定唯一用户名的 SSO 系统,肯定也有许多小型网站,例如拥有几十个 WordPress 用户,并且这种情况是约定俗成的。
simon
7
对此有一个现成的解决方案。Discourse 可以配置为 WordPress 的 DiscourseConnect 提供商(与通常的配置相反)。设置起来很简单。启用后,有一个可选设置允许根据用户的电子邮件地址同步 WordPress/Discourse 帐户。
甚至还有一个链接添加到用户的个人资料页面:
(编辑:能否在没有 AI 的情况下为图片添加字幕?)
现在正在测试,点击个人资料页面上的链接没有填写 Discourse 用户名字段。它应该填写。点击可以添加到登录页面上的“使用 Discourse 登录”链接会导致 Discourse 用户名字段自动更新。
我认为同步帐户的目的是以安全的方式更新 Discourse 用户名字段,所以这可能值得看看是怎么回事。还有一个问题是,WordPress 上电子邮件地址“未经验证”的帐户被允许与 Discourse 同步其帐户。默认情况下可能不应允许这样做。
对于您的情况,您可能不希望允许用户通过 Discourse 登录 WordPress。应该可以通过个人资料页面上的链接来允许用户同步他们的帐户,以便自动填写他们的 Discourse 用户名字段。您不必启用通过 Discourse 登录 WordPress 即可实现此目的。
这种方法的一个潜在缺点是用户必须主动进行。它不会提供一个管理员可以点击以获取用户 Discourse 用户名的按钮。
mattdm
(Matthew Miller)
8
这似乎很愚蠢。我们_有_一个集中的SSO。我们不应该配置一些服务来使用其他随机服务作为身份验证提供商,才能让它们协同工作。这会让人抓狂。
simon
9
不要被名称(DiscourseConnect)所迷惑。如果我描述的功能按预期工作,它只会是一种让 WordPress 用户确认他们拥有一个 Discourse 帐户且电子邮件地址匹配,并在 WordPress 上自动填写其 Discourse 用户名的方式。它不会影响您网站的身份验证系统。
angus
(Angus McLeod)
10
核心插件中永远不会有 WordPress 用户名与 Discourse 用户名匹配的身份机制,即使在设置后面也是如此。在此背景下唯一可能的是电子邮件匹配。我已决定将电子邮件匹配添加为用户 webhook 的备用机制。它将在下一个版本中推出,该版本将在几周内发布。
1 个赞
angus
(Angus McLeod)
11
为了完成此事的闭环,插件的最新版本 2.5.4 包含对 Webhooks 的各种更新,包括删除“按电子邮件匹配用户”设置的 DiscourseConnect 要求。请参阅
1 个赞
mattdm
(Matthew Miller)
12
我认为这至少能在 99% 的情况下解决我们的问题。谢谢!!!
@jwheel 供您参考,我已经在我方网站上启用了此功能。
2 个赞