如果需要对 WebHook 设置安全机制,则需要在技能设置里开启 WebHook 鉴权,并提供公钥。
RSA鉴权.gif

a、选择加密后,则会将【请求数据】中提到的请求对象先转换成 json 串,然后进行加密传输
b、用户上传 RSA 的公钥串到开放平台,公私钥可以使用 SDK 提供的工具类生成,如果用户需要自己生成,秘钥位数必须设置为 1024 位,并需要将公钥以 base64 编码成格式友好的公钥串,如果用户是使用 openssl 等工具生成的公钥,则已经是编码后的了,可以直接上传使用
c、用户自己保存公钥,阿里开发者平台请求用户服务时,会将上述提到的 TaskQuery 对象进行加密,用户得到加密后的字符串后使用自己的私钥进行解密之后使用

1. RSA加密的请求对象结构

字段名 type 描述 是否必要
queryMetaInfo QueryMetaInfo 加密请求元数据
securityQuery String 将前文提到的TaskQuery对象进行加密后的字符串,该对象解密后就是前文提到的语义请求对象

QueryMetaInfo对象字段说明

字段名 type 描述 是否必要
source String 请求来源标示,值默认为
queryVersion String 加密策略版本
securityMode String 加密方式 当前为RSA

2. 加密请求串样例

  1. POST http://your-webhook-service.com/skill/weather
  2. Headers:
  3. //默认已填充,规定请求体中的数据格式
  4. Content-type: application/json
  5. //用户自定义headers
  6. //key1: value1
  7. //key2: value2
  8. POST body:
  9. {
  10. "queryMetaInfo": {
  11. "queryVersion": "V1",
  12. "securityMode": "RSA",
  13. "source": "ali-genie"
  14. },
  15. "securityQuery":"WrMHm5wsw1g8UIsNX2TQ/D2Dsk6g6WYdg205dmMtsAumm+evdfjH80q+Dh1ptZOviPpzuYC8VkI2Md9quXfte6QHu5/cwgjgmceBsk8oIQAt56241/XgPrIKLkwwgD7vmX+CEOLH+o4webbZUUpwsCmzO0CqOBXUljSMna+qc5AjwJmhpVofb0y3lhlfH+l+pzjtCULQugYCIfNO+5Pwa9JKoX3ZP93+FJErO2ar1Iedh3i7SVTF50PBlvVyR/RJtbobespYhW6Oza4A=="
  16. }

3. java方式的处理范例

  1. @RequestMapping(value = "/skill/weather", method = RequestMethod.POST)
  2. public @ResponseBody ResultModel<TaskResult> getResponse(@RequestBody String securityWrapperTaskQuery,@RequestHeader HttpHeaders headers) {
  3. //需要先得到加密后传输的对象
  4. SecurityWrapperTaskQuery wrapperTaskQuery = MetaFormat
  5. .parseToWrapperQuery(securityWrapperTaskQuery);
  6. //然后利用RSA私钥解密语义理解对象,解密后为JSON格式的字符串
  7. String taskQuery = RSAUtil.decryptByPrivateKey(wrapperTaskQuery.getSecurityQuery(),
  8. privateKey);
  9. /**
  10. * 将开发者平台识别到的语义理解的结果(json字符串格式)转换成TaskQuery
  11. */
  12. TaskQuery query = MetaFormat.parseToQuery(taskQuery);
  13. //进行处理执行
  14. /**
  15. * 构建服务返回结果
  16. */
  17. ResultModel<TaskResult> resultModel = new ResultModel<TaskResult>();
  18. return resultModel;
  19. }