智能应用开放平台

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

RSA鉴权.gif


a、选择加密后,则会将【请求数据】中提到的请求对象先转换成 json 串,然后进行加密传输

b、用户上传 RSA 的公钥串到开放平台,公私钥可以使用 SDK 提供的工具类生成,如果用户需要自己生成,秘钥位数必须设置为 1024 位,并需要将公钥以 base64 编码成格式友好的公钥串,如果用户是使用 openssl 等工具生成的公钥,则已经是编码后的了,可以直接上传使用

c、用户自己保存公钥,阿里开发者平台请求用户服务时,会将上述提到的 TaskQuery 对象进行加密,用户得到加密后的字符串后使用自己的私钥进行解密之后使用


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

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


QueryMetaInfo对象字段说明

字段名type描述是否必要
sourceString请求来源标示,值默认为
queryVersionString加密策略版本
securityModeString加密方式 当前为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;
    }