Discourse 使用 DiscourseConnect 来进行用户数据同步

我们都知道 Discourse 的用户管理和设置都高度依赖电子邮件。

如果 Discourse 没有设置电子邮件 SMTP 的话,作为管理员是没有办法对用户邮箱进行修改并且通过验证的。

可以采取的办法是通过 Discourse 的 DiscourseConnect 来进行用户同步。

根据官方的说法:使用 DiscourseConnect 对 用户邮箱进行修改是不会对邮箱的合法性进行校验的,默认的情况下是你已经对用户邮箱进行校验了。

这个 DiscourseConnect 有些配置是需要配置的,可以通过对 API 接口的调用来完成。

调用的方法为 POST。

Discourse 的配置

默认情况下 DiscourseConnect 是关闭的,所以需要在 Discourse 中启用 DiscourseConnect 才可以。

在配置中搜索:DiscourseConnect 关键字。

上面图片中的 3 个配置是需要进行配置的。

discourse connect url : 是 DiscourseConnect 的调用配置地址。这个地址通常是你网站的域名后添加 DiscourseConnect/start

这个配置是必须要配置的。

discourse connect secret:这是用来在客户端对数据进行 hmac 算法加密时候使用的。如果这个地方修改了,后面的加密算法就会出现错误字符串,那么 API 调用就会失败。
这个字符串是随机的,你可以随便生成自己的字符串,然后告诉后面程序中这个字符串是什么。

enable discourse connect:启用 DiscourseConnect 接口连接。在完成上面的 2 个选项配置后,就可以启用接口了。这个时候 Discourse 实例就才可以接受 SSO 用户数据。

访问基本参数

要完成 API 调用,有下面的 4 个参数在访问之前必须获得。

参数名称
apiKey 4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a
apiUser system
connectSecret jdhb19*Xh3!nu(#k
url https://www.isharkfly.com/admin/users/sync_sso

在上面的 4 个参数中,需要注意的是 connectSecret,只有这个是在 DiscourseConnect 中设置的。

其他的参数为 Discourse API 调用的默认参数。

构建 POST 请求

在发送的 POST 中是一个 JSON 格式的数据。

这个数据为:

  body: JSON.stringify({
    sso: ssoPayload,
    sig: signature,
  })

上面的 JSON 格式是 2 个参数,一个为 SSO,另外一个 SIG。

SSO 是 Base64的数据,sig 是加密后的数据。

ssoPayload = Buffer.from(ssoRecord, 'utf8').toString('base64');
signature = crypto.createHmac('sha256', connectSecret).update(ssoPayload).digest('hex');

加密算法使用的是 SHA256,摘要算法为 hex。

当上面的数据都准备完全后,就可以把数据发送到服务器上了。

数据结果

如果用户数据没有问题,那么将会创建一个 SSO 的数据。

在 Discourse 的后端将会看到下面的内容。

后端显示的 SSO 添加的用户数据。

上面有个最重要的 External ID。