禁用受邀用户的激活邮件要求

大家好,我有一个目前支持得不太好的用例:我需要禁用受邀用户的激活邮件——包括通过链接邀请的用户

在我发起上述话题后,该功能已被实现,但仅适用于通过电子邮件邀请的用户。

我的 Discourse 实例仅支持邀请注册,我确实通过电子邮件发送邀请链接,但并非使用 Discourse 内置的邮件系统。我通过向 /invites/link 发送 POST 请求生成邀请链接,并将其存储在一个外部数据库中,然后从那里将链接发送给用户。因此,当用户点击链接时,他们实际上已经验证了邮箱,但随后又被要求再次验证。

我意识到我的用例并不特别常见,所以我想尝试编写一个简单的插件,修改 Discourse 的相关部分,以实现我所需的功能。

我已经搭建好了插件的基本框架,并添加了一个站点设置(no_activation_enabled)。在浏览核心仓库后,我猜测可能需要编辑的文件是:

我不太确定,但我想,也许通过条件性地(如果 SiteSetting.no_activation_enabled 为真,并且用户是由工作人员邀请的,也许是 invite.invited_by.staff?)将 user.attributes 中的 active 改为 true 就能实现:

    user.attributes = {
      email: invite.email,
      username: available_username,
      name: name || available_username,
      active: false,
      trust_level: SiteSetting.default_invitee_trust_level,
      ip_address: ip_address,
      registration_ip_address: ip_address
    }

但是,我该如何在插件中修改这部分呢?这是否在插件的功能范围内?还是说插件只能添加内容,不能修改现有内容?或者我需要替换整个 invite_redeemer.rb 文件?

我已经完成了插件开发的入门教程,以及这篇指南,但在花费数小时深入代码库(包括其他插件)后,我感觉自己像是在撞墙……所以,如果有任何人能给我一些指点,我将不胜感激!

如果你是从外部站点处理此事,为什么不让它处理单点登录(SSO),并将验证信息直接通过负载传递呢?

你好,Stephen,感谢你的反馈。

我不在外部网站上管理用户账户。我使用一个主 Airtable 配合 Zapier 和 GCFs,将多个服务(如 ESP 等)连接起来,但 Discourse 是主要的用户数据库。我只是不想使用 Discourse 的常规注册表单,因为它的转化率不高,也无法集成到博客文章等场景中。实际上,Discourse 是作为基于 Jekyll 的内容网站的单点登录(SSO)提供商,它会发送 fetch 请求来检查用户是否已在 Discourse 上登录,并据此调整内容页面。

嘿,欢迎 :slight_smile:

@Stephen 一样,我也不太确定这是否是正确的工具,但我相信你已经充分考虑过了。

我会尽量避免这样做。几乎总有其他解决方案,即使你需要对类进行 monkey patch。关于 Discourse 中的 monkey patch,请参阅:https://meta.discourse.org/t/tips-for-overriding-existing-discourse-methods-in-plugins/83389。

在本例中,似乎你关注的该方法中已有代码实现了你想要的功能:discourse/app/models/invite_redeemer.rb at main · discourse/discourse · GitHub

问题在于你生成的邀请没有正确的 emailed_status_type,因此该条件未通过。我认为这里的解决方案是从一开始就生成不同的邀请。我会将重点放在那里。

这本质上是在重新引入一个因过于危险而从核心功能中移除的特性——如果你处理这些邀请令牌不当,任何在预期接收者使用之前窃取令牌的人都可以冒充接收者登录论坛。我强烈建议不要为任何版主或管理员账户使用此类邀请方式。

因此,处理此功能的代码已经存在,但你需要进行一些自定义调整才能真正调用它。