教育号的事件通通知机制
当教育号的通讯录、应用和消息等数据或状态发生变化时,会触发相关的事件,并通过回调机制将事件通知到第三方应用。
关于事件通知的详情可参考文档:
搭建回调服务来处理来自教育号的事件通知
如果第三方应用的业务场景需要关注并实时获取到上述变更的内容,则需先搭建好回调服务,接收教育号的事件通知并进行处理。
如何配置回调服务
配置回调服务,需要有三个配置项,分别是:URL, Token, EncodingAESKey。其中 URL 由开发者在应用接入平台配置,Token 和 EncodingAESKey 在平台自动随机生成。
首先,URL 为回调服务地址,由开发者搭建,用于接收通知消息或者事件。其次,Token 用于计算签名,由英文或数字组成且长度不超过32位的自定义字符串。开发者提供的URL是公开可访问的,这就意味着拿到这个URL,就可以往该链接推送消息。
那么 URL 服务需要解决两个问题:
- 如何分辨出是否为教育号来源
- 如何分辨出推送消息的内容是否被篡改
通过数字签名就可以解决上述的问题。具体为:约定Token作为密钥,仅开发者和平台知道,在传输中不可见,用于参与签名计算。教育号在推送消息时,将消息内容与Token计算出签名。开发者接收到推送消息时,也按相同算法计算出签名。如果为同一签名,则可信任来源为教育号,并且内容是完整的。如果非教育号来源,由于攻击者没有正确的Token,无法算出正确的签名。如果消息内容被篡改,由于开发者会将接收的消息内容与Token重算一次签名,该值与参数的签名不一致,则会拒绝该请求。
最后,EncodingAESKey 用于消息内容加密,由英文或数字组成且长度为43位的自定义字符串。由于消息是在公开的因特网上传输,消息内容是可被截获的,如果内容未加密,则截获者可以直接阅读消息内容。若消息内容包含一些敏感信息,就非常危险了。EncodingAESKey就是在这个背景基础上提出,将发送的内容进行加密,并组装成一定格式后再发送。
回调服务的实现
回调服务需要支持接并处理收来自教育号的Http Post请求
1. 接收事件通知
假设接收消息的URL设置为 http://notifyurl.com
请求方式:POST
请求地址 :http://notifyurl.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS×tamp=13500001234&nonce=123412323
请求体(xml格式):
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<Encrypt><![CDATA[msg_encrypt]]></Encrypt>
</xml>
参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg_signature | String | 教育号加密签名,msg_signature 结合了开发者填写的 token、请求中的 timestamp、nonce 参数、加密的消息体 |
timestamp | Integer | 时间戳。与 nonce 结合使用,用于防止请求重放攻击。 |
nonce | String | 随机数。与 timestamp 结合使用,用于防止请求重放攻击。 |
ToUserName | String | 第三方应用回调该值为 SuiteId |
Encrypt | String | 消息结构体加密后的字符串 |
2. 处理事件通知
开发者收到事件通知后,需要作如下处理:
- 对 msg_signature 进行 校验
- 解密 Encrypt,得到明文的消息结构体
- 如果前两步正常,则返回字符串 "success"
具体加解密操作流程可以参考附录 加解密方案说明