如果需要对 WebHook 设置安全机制,则需要在技能设置里开启 WebHook 鉴权,并提供公钥。
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. 加密请求串样例
POST http://your-webhook-service.com/skill/weather
Headers:
//默认已填充,规定请求体中的数据格式
Content-type: application/json
//用户自定义headers
//key1: value1
//key2: value2
POST body:
{
"queryMetaInfo": {
"queryVersion": "V1",
"securityMode": "RSA",
"source": "ali-genie"
},
"securityQuery":"WrMHm5wsw1g8UIsNX2TQ/D2Dsk6g6WYdg205dmMtsAumm+evdfjH80q+Dh1ptZOviPpzuYC8VkI2Md9quXfte6QHu5/cwgjgmceBsk8oIQAt56241/XgPrIKLkwwgD7vmX+CEOLH+o4webbZUUpwsCmzO0CqOBXUljSMna+qc5AjwJmhpVofb0y3lhlfH+l+pzjtCULQugYCIfNO+5Pwa9JKoX3ZP93+FJErO2ar1Iedh3i7SVTF50PBlvVyR/RJtbobespYhW6Oza4A=="
}
3. java方式的处理范例
@RequestMapping(value = "/skill/weather", method = RequestMethod.POST)
public @ResponseBody ResultModel<TaskResult> getResponse(@RequestBody String securityWrapperTaskQuery,@RequestHeader HttpHeaders headers) {
//需要先得到加密后传输的对象
SecurityWrapperTaskQuery wrapperTaskQuery = MetaFormat
.parseToWrapperQuery(securityWrapperTaskQuery);
//然后利用RSA私钥解密语义理解对象,解密后为JSON格式的字符串
String taskQuery = RSAUtil.decryptByPrivateKey(wrapperTaskQuery.getSecurityQuery(),
privateKey);
/**
* 将开发者平台识别到的语义理解的结果(json字符串格式)转换成TaskQuery
*/
TaskQuery query = MetaFormat.parseToQuery(taskQuery);
//进行处理执行
/**
* 构建服务返回结果
*/
ResultModel<TaskResult> resultModel = new ResultModel<TaskResult>();
return resultModel;
}