如果需要对 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方式的处理范例
value = "/skill/weather", method = RequestMethod.POST) ( public ResultModel<TaskResult> getResponse( String securityWrapperTaskQuery, 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; }