我们都知道 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。