为 SSO 禁用电子邮件验证

你好,

我已将 Discourse 配置为使用 Auth0 作为单点登录(SSO)提供商。我遇到的问题是,当用户注册时,他们会收到两封验证邮件:一封来自 Auth0,另一封来自 Discourse。

是否有任何方法可以禁用来自 Discourse 的那封邮件?

提前感谢。

如果邮箱地址已通过 Auth0 验证,您可以通过启用 oauth2 email verified 站点设置来禁用 Discourse 的验证邮件。该设置的相关说明可参考此帖子:https://meta.discourse.org/t/how-to-use-auth0-with-the-oauth2-basic-plugin/64633/33。

3 个赞

谢谢你的回答 @simon,但我使用的是 SSO,而不是 OAuth2。

2 个赞

术语“SSO”有时被用于指代几种不同的身份验证方法,这在过去曾引起过一些混淆。

如果您使用的是 Discourse 的 SSO 实现,那么邮箱验证由 SSO 参数 require_activation 控制。将该参数设置为 "false" 即可绕过邮箱验证。

3 个赞

再次感谢 @simon

我想避免完全禁用它。目前我的设置是,require_activation 根据用户是否已通过 Auth0 验证来返回 true 或 false。这样运行良好,用户在点击 Auth0 的验证邮件后,下次登录时就会在 Discourse 上完成验证。

所以理想情况下,只需抑制该邮件即可,除非我遗漏了什么。

1 个赞

这很有道理。我们的 WordPress 插件也是以同样的方式处理邮箱验证的。

如果你想了解 Discourse 如何使用 require_activation 的值,可以查看这个文件:https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L81。你会看到,当用户首次通过 SSO 创建时,如果 require_activation 被设置为 "false",Discourse 会直接创建一个已激活的用户;如果设置为 "true",则用户必须点击 Discourse 激活邮件中的链接后才会被激活。

一旦用户在 Discourse 中被设置为 active,唯一可能导致用户需要重新激活的情况是:你启用了 sso_overrides_email 站点设置,并且用户在 SSO 提供商网站上更新了其邮箱地址。

require_activation 设置为 "true" 时,它还会阻止 Discourse 根据邮箱地址将现有用户与外部站点中的用户进行匹配。这可能会在 SSO 实施时引发问题,特别是当站点上已经存在通过用户名/密码创建的用户账户时。

1 个赞

谢谢,这说得通。不过我不太明白这如何能阻止 Discourse 发送“验证邮箱”邮件?

我只希望发送来自 Auth0 的那封邮件。

若希望验证邮件仅由您的 SSO 提供商站点发送,用户需在该站点注册并验证其电子邮件地址,然后才能首次登录 Discourse。之后,您即可将这些用户的 require_activation 参数设置为 "false"。这些用户将被创建为 Discourse 上的激活用户,且不会收到 Discourse 的激活邮件。

2 个赞

这说不通。我该如何在用户首次登录 Discourse 之前验证他们的邮箱?
我的网站已经处理了邮箱验证,我该如何禁用 Discourse 发送验证邮件,同时仍向用户显示需要验证的提示?

DiscourseConnect 假定您已在网站上验证了邮箱地址。只要您正在执行此操作,请勿在 SSO 载荷中设置 require_activation 参数。如果该参数不在载荷中,用户将直接登录 Discourse,而不会向他们发送激活邮件。

2 个赞

是的,但这样一来 Discourse 会假定这些用户已验证,如果用户访问了论坛却忘记或决定不验证邮箱,这可能并不属实。如果网站将 require_validation 设置为 true,意味着用户在网站上尚未验证邮箱,但肯定已收到验证链接,因此无需 Discourse 再次发送,但由于该参数,Discourse 仍会发送。

基本上,只有当用户在验证前访问 Discourse 时才会出现此问题。因此,目前我基本上只能在两个选项中做出选择:

  1. 用户只收到一封验证邮件,但会被 Discourse 视为已验证,这并不理想,因为他们可能不会完成验证。
  2. 用户收到两封验证邮件,但会被论坛和网站正确验证。此选项也不理想,但肯定是两个选项中更好的选择。

还有第三个选项:添加一个仅在启用 SSO 时生效的开关,禁用 Discourse 的验证邮件(但保留一个错误页面,告知用户他们尚未验证)。

理想情况下,当用户在您的网站上创建账户时,您应通过发送激活邮件来验证其邮箱地址,该邮件应从您的网站发出,并在用户注册时触发。如果出于某种原因,您允许用户在未验证邮箱地址前就在您的网站上创建账户,您可以在 SSO 载荷中有条件地设置 require_validation 参数。如果用户已验证邮箱地址,请将 require_validation 设置为 false,或者直接从载荷中省略该参数。如果用户尚未在您的网站上验证邮箱地址,请将 require_activation 参数设置为 true,以便 Discourse 向其发送激活邮件。

1 个赞

这正是我正在做的,而且这是一个问题。例如,用户注册后会收到一封来自网站的激活邮件,但他们没有打开邮件进行激活,而是直接前往 Discourse。此时 require_activation 将被设置为 true,因为用户尚未激活。然而,Discourse 会判定用户需要再发送一封激活邮件,这就产生了问题,因为网站上已经有一封等待用户打开的激活邮件。Discourse 应该只显示一条错误消息,提示用户检查他们的邮箱。