DiscourseConnect 是 Discourse 的核心功能,允许您配置“单点登录 (SSO)
您好,我很难找到任何信息,但它使用的是什么协议?假设是oauth2?参数似乎不匹配,并且我收到提供商的错误,该提供商似乎接受 sso= 参数?救命!\n\n谢谢
DiscourseConnect 是 Discourse 的 SSO 实现。它不使用标准协议。
如果您不介意查看 PHP 代码,这里有一个示例实现:https://github.com/discourse/wp-discourse/blob/main/lib/sso-provider/discourse-sso.php。
是的,那行不通。如果您有想要用于验证用户的 OAuth2 提供商,请查看 Discourse OAuth2 Basic 插件。
感谢 @simon。PHP 代码也是一个提供者,而不是消费者吗?我还看到了一个 OIDC 提供者,它也可能起作用,还有一个插件区域中的“中间人”提供者。
如果 SSO 提供者是非标准的,那么它打算为谁/什么服务,如果它不能与其他提供者很好地协同工作的话?
再次感谢!
我链接的代码是用于将 WordPress 作为 Discourse 的身份验证提供者。
WordPress 插件还允许将 WordPress 用作 DiscourseConnect 客户端:https://github.com/discourse/wp-discourse/tree/main/lib/sso-client。
我不确定在 Discourse 中添加自定义 SSO 实现的动机是什么。我猜是有商业原因的。
它提供的一个好处是允许将外部站点与 Discourse 紧密集成。例如,此处列出的所有用户属性都可以在身份验证过程中与 Discourse 同步:discourse/lib/discourse_connect_base.rb at 7b89fdead98606d4f47ceb0a1d240d0f6e5f589e · discourse/discourse · GitHub
它还允许将未配置为 OAuth2 或 OpenID Connect 提供者的站点用于对 Discourse 上的用户进行身份验证。
缺点是它需要在身份验证提供者站点上添加一些自定义代码。
您好,我想了解一下在提供 SSO 的外部网站上不验证电子邮件地址会存在哪些问题。仅仅是这样会助长自动垃圾邮件吗?还是有其他需要考虑的因素?如果外部网站不进行电子邮件验证,为什么不建议 Discourse 来处理电子邮件验证?
感谢您提供的任何额外见解。
据我所知,最糟糕的情况需要满足以下条件:
- 电子邮件地址未在外部网站上进行验证
- SSO 负载中未设置
require_activation=true - Discourse 站点上已存在没有关联
SingleSignOnRecord的帐户(帐户所有者从未通过 SSO 登录过 Discourse)
在这种情况下,有人可以在外部网站上使用从未通过 SSO 登录过的 Discourse 用户的电子邮件地址注册。这将允许来自外部网站的未经验证的帐户接管使用相同电子邮件地址的 Discourse 帐户。如果这是 Discourse 上的管理员帐户,那将尤其令人担忧。
如果外部网站未处理电子邮件验证,确实建议 Discourse 处理电子邮件验证:
不过,在外部网站上处理电子邮件验证有几个原因更好:
- 强制用户接收来自 Discourse 的确认电子邮件会在用户首次尝试登录 Discourse 时增加一些摩擦。(但实际上,这种摩擦必须发生在某个地方——要么在 Discourse 端,要么在外部网站端。)
- 如果 SSO 负载中的
require_activation设置为true,Discourse 将不会根据电子邮件地址将现有的 Discourse 帐户与外部登录匹配。如果您在 DiscourseConnect 启用后,某些帐户已通过用户名/密码注册创建,那么这将是一个问题。如果您出于任何原因需要删除 Discourse 上的SingleSignOnRecord条目,那也将是一个问题。当用户尝试重新登录 Discourse 时,Discourse 不会自动创建新的SingleSignOnRecord条目。
谢谢,@simon - 这非常有帮助!
您好,我有一个关于 SSO payload 中 groups 字段的问题。
自动用户组(例如管理员、版主和信任等级)也会被覆盖吗?还是会保留?
不会!假设该设置的描述是正确的,它只会影响手动用户组。
你知道吗……我在描述中没有看到“手动”这个词。听起来很有希望,符合我的用例,我会试试看,然后回来汇报。
当我读到这里时,我以为我应该直接从base64编码的载荷生成签名。我没有意识到你需要从UTF-8字节生成它。能否澄清一下?
我一直在使用 DiscourseConnect - 文档很棒,谢谢。
不过我遇到了一些障碍,希望得到一些帮助/澄清。
我们希望用户能够使用他们的 Discourse 登录来登录 Wordpress(这工作正常
) - 然而。
-
是否可以通过 Discourse 注册来创建 Wordpress 用户(当用户创建 Discourse 用户帐户时,它会自动为他们创建 wordpress 帐户/配置文件,以便他们可以登录 wordpress)
-
是否可以同步 Workpress 用户组和 Discourse 组。
如果用户同时拥有 Wordpress 和 Discourse 用户帐户,DiscourseConnect 能够将它们关联起来 - 但它不会给 wordpress 帐户与其同名的 Discourse 组的用户组,反之亦然(如果组名称不同怎么办 - 我该如何告诉 DiscourseConnect 在用户拥有名为“Group for Testing Things”的 Discourse 组时,为他们分配名为“Testing Group”的用户组?)
我错过了什么?
我不知道答案,但是……
要小心。这在某种程度上是非法的,而且被广泛认为是不好的做法(当然,网站所有者除外
),因为这会在用户不知情或未经同意的情况下发生,同时数据也会被转移到其他地方。
当然,这在某种程度上处于灰色地带,基本上,例如,谷歌就是这样做的。
但是……为什么?在WordPress端仅限于Discourse SSO登录,并将用户重定向到Discourse进行账户创建,仅此而已。但据我所知,你无法开箱即用地自动同步用户账户。而且你为什么要这样做,因为有了SSO,当用户需要时就会发生。
在我们的场景中(作为一个会员组织)
- WordPress 用于管理订阅、在 WordPress 商店购买商品,我们使用用户组来管理会员在组织内的权限
- Discourse 是我们的论坛/在线社区,我们使用群组来控制用户可以访问 Discourse 的哪些区域)
目前,新会员需要设置一个 WordPress 账户(并设置他们的订阅等),同时还需要设置一个 Discourse 账户,并且用户组-Discourse 群组是手动管理/同步的。
我正在寻找一个解决方案,让新用户只需设置一次即可创建两个账户,并且用户组-Discourse 群组能够自动同步——我相信我可以通过 API 等方式解决群组同步问题。我试图解决/避免的是多用户账户设置问题。
听起来您正在使用 Discourse 作为 WordPress 的 SSO 提供商。该方法在此处进行了概述:使用 Discourse 作为身份提供商 (SSO, DiscourseConnect)。Discourse WordPress 插件提供了将 WordPress 作为 Discourse 的 SSO 提供商,或将 Discourse 作为 WordPress 的身份提供商的选项。对这两种方法使用相同的名称会导致一些混淆。
在这种情况下,我倾向于使用 WordPress 作为身份提供商。通过这种方法,用户将在您的 WordPress 网站上创建账户,然后使用他们的 WordPress 凭据登录 Discourse。需要注意的一点是,这意味着用户只能通过 WordPress 登录 Discourse,而无法在没有 WordPress 账户的情况下创建 Discourse 账户。我认为这是将 Discourse 与 WordPress 会员网站集成时的合适设置。
当 WordPress 被用作 Discourse 的身份提供商时,有几个实用函数可用于根据用户在 WordPress 上的活动来设置用户的 Discourse 群组会员资格。这些函数在此处进行了概述:使用 WP Discourse SSO 管理 Discourse 中的群组会员资格。
回到您最初的问题:
我有一段时间没有查看 WordPress 插件的 DiscourseConnect 客户端代码了,但我认为您所询问的功能或多或少是该代码的预期工作方式。如果用户拥有 Discourse 账户,他们只需点击 WordPress 上的“通过 Discourse 登录”链接,就会为他们创建一个账户。
在使用 WordPress 作为 DiscourseConnect 客户端时,这在技术上是可行的,但除非有什么变化,否则您将无法使用我链接到的文档中概述的 add_user_to_discourse_group 和 remove_user_from_discourse_group 方法。您需要做一些事情,例如设置一个 Discourse Webhook,在用户被添加到 Discourse 群组时触发,然后在 WordPress 上添加一些代码来处理该 Webhook。要将群组从 WordPress 同步到 Discourse,当 WordPress 上发生更改时,您需要向 Discourse 发出 API 调用来更新用户的群组。因此,如果您使用 WordPress 作为 DiscourseConnect 提供商,那么一些相对容易实现的事情,如果使用 WordPress 作为 DiscourseConnect 客户端,可能会有些复杂。
除非使用自定义登录,因为通常在使用 WooCommerce/memberships/LLM 时会出现这种情况,并且默认情况下不会强制只使用 Discourse SSO 作为提供商,这需要一些自定义工作。
有几个可能的问题,一个与缓存有关,另一个与某些插件添加的登录重定向有关。遇到这些问题的任何人都可以到 Support > WordPress 类别中提问。这些问题通常很容易解决。
我完全忘了回复:确实,它的作用与描述的完全一样,只影响手动群组。
你好 @simon,
我认为我真的需要一些关于我的 SSO 功能 POC 探索中的 404 响应的帮助。我为这个问题花了一整天的时间,但仍然无法弄清楚问题所在。我能够:
- 启用 discourse_connect
- 将 discourse_connect_url 设置为 https:/ /localhost:4200/login
- discourse-connect secret:20’s (1) 1111111111111111111 保持简单
然后在我的 Angular 应用的登录页面,我通过以下代码发送了这个请求:
但我收到了 404 未找到的响应。
根据我的理解,在向 admin/users/sync_sso 端点发送 POST 请求时,如果用户不存在于 discourse 中,它应该根据 user_id 和 email 创建一个新用户,然后返回的结果应该是一个用户对象,而不是一个状态码为 404 的空对象。
我也检查了日志,它没有提供任何与此失败响应相关的信息。
提前感谢!
