是否可以通过 API 发送电子邮件登录链接?

你好!我非常喜欢使用 Discourse API!

在参考了关于逆向工程 API 的指南后,我在让 API 发送登录链接时遇到了问题。

我这样做的背景
我为本地的黑客空间搭建了一个 SSO 服务,以便用户可以使用黑客空间的会员系统登录我们的 Discourse。

不过,有些人在会员系统中使用的电子邮件地址可能与 Discourse 中的不同。由于启用了 SSO 后本地登录已被禁用,我希望用户能够点击“通过电子邮件发送登录链接”,这样他们就可以登录,然后选择更新他们的电子邮件地址(或者继续使用登录链接,随他们便)。

目标
我想通过 API 向 user@domain.co.uk 发送一个登录链接。

我尝试了以下命令:

curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user\"%\"40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"

返回的结果是:

<html><body>You are being <a href="https://discourse.<site>.org.uk/">redirected</a>.</body></html>

如果我不包含 API 密钥,则会收到 [BAD CSRF] 错误。

所以我卡住的地方是:如何通过 API 让 Discourse 向 user@domain.co.uk 发送登录链接?

非常感谢任何帮助,我会继续尝试各种方法,看看什么有效。


附:我不希望使用像下面这样的变通方法:
先向 /session/csrf 发送请求并保存 CSRF 令牌,
然后携带该 CSRF 令牌向 /u/email-login 发送请求。

是否仅使用 API 密钥就能完成此操作?

谢谢!
:slight_smile:

跟进一下,使用 CSRF 路由后接邮件链接路由是否是正确的做法?

在提供 API 密钥的情况下,API 中是否有此功能的实现?

你们的 SSO 服务如何与 Discourse 对接?如果您使用的是 DiscourseConnect,那么 /u/email-login 端点将被禁用。

感谢您的回复。是的,确实使用了 Discourse Connect

起初我也这么认为,所以我禁用了 Discourse Connect,尝试获取登录链接,但无法使其正常工作,这就是我上面帖子中输出内容的原因。

如果在启用 Discourse Connect 的情况下禁用了邮件链接功能,那我就需要重新思考如何将会员系统的 SSO 服务与 Discourse 进行账户关联的方案了。

正如你所提到的,最简单的方法是通过电子邮件地址来匹配账户。如果这不可行,我们可以采用以下几种方法:

  1. 使用其他唯一标识符来匹配用户。你可以通过控制台预先为某个用户创建 DiscourseConnect 关联。这仅在你拥有某个在 Discourse 和身份提供商之间保持一致的其他标识符时才有效。

  2. (最常见)允许用户注册新账户,然后让他们联系管理员,请求将新账户“合并”到旧账户中(使用用户管理页面底部的按钮)。这将自动匹配电子邮件地址,并创建 DiscourseConnect 关联。

感谢您的回复。

合并账户的方案可能是我会采用的方式。

如果这一过程能支持自助操作,那将是一个非常棒的功能——例如通过 API 实现:用户通过邮件链接登录后,即可更新邮箱以同步两个账户。
或者,也可以允许用户通过提供其 Discourse 邮箱和密码,并配合新的邮箱地址来完成身份验证。

再次感谢您的时间。