本章节仅为HarmonyOS Agent通信协议定义的Push通知,而非华为Push推送服务。
Agent Server发送Push给Agent Client请求消息:
curl 'https://hag.cloud.huawei.com/open-ability-agent/v1/agent-webhook' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'x-hag-trace-id: {{客户端使用随机数生成。}}' \
-H 'X-Access-Key: {{从小艺开放平台获取的触发器事件WebHook分配的appKey}}' \
-H 'X-Sign: {{从小艺开放平台获取的触发器事件WebHook分配的secretKey生成的签名,参数签名=Base64(HMAC-SHA256(secretKey, ts))。 其中secretKey 为开发者在小艺开放平台上配置的接入密钥(secretKey)}}' \
-H 'X-Ts: {{时间戳,用于加密和缓存穿透。 格式为:当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。 例如:2018/1/1 08:00:00.000 的时间戳为"1514764800000"}}' \
-d '{
"jsonrpc": "2.0",
"id": "{{与agent-server通信的全局唯一消息序列号,给agent-server答复请求结果时需取出返回}}",
"result": {
"id": "{{使用请求中的该字段返回,一次流式交互中(从发起本次请求到本次请求完成处理之间)保持不变}}",
"apiId": "{{创建api时生成的API ID,CP请求时带上}}",
"pushId": "{{请求时使用平台系统变量push_id,代表通过webhook推送通知时使用的唯一ID。}}",
"agentLoginSessionId":"{{账号授权时三方Agent服务器提供的用户授权身份ID。}}",
"pushText": "{{Push通知的展示内容,按Push服务规格提供}}",
"kind": "{{事件类型,值为task}}",
"artifacts": [
{
"artifactId": "{{本条Artifact的唯一ID,用于CP请求消息的去重}}",
"parts": [
{
"kind": "text",
"text": "{{agent-server处理的响应,如果是markdown流式输出也在此处存放}}"
},
{
"kind": "data",
"data": "{{结构化数据,以JSONObject形式存放,承载用户结果过程数据及A2A的扩展字段}}"
}
]
}
],
"status": {
"state": "{{任务状态,取值为[completed|canceled|failed]其中之一}}"
}
},
"error": {
"code": "{{JSONRPCError错误码,整型类型}}",
"message": "{{JSONRPCError错误描述}}"
}
}' 上述X-Sign的计算方法如下:
1)防重放
出于防重放攻击的需要,服务端应该校验报文中的ts和当前实际时间相差在一个范围内。
例如:校验服务器侧时间戳与请求报文中的时间戳差值的绝对值(ABS),小于15分钟。
2)签名算法
Sign的计算代码示例,服务器侧可以基于ts计算该sign,与请求中的sign比对是否相等,以达到验证客户端身份的目的。
String secret = "密钥";
String ts = "从消息头中获取ts";
Mac mac = Mac.getInstance("HmacSHA256");
SecretKey secretKey = new SecretKeySpec(secret.getBytes(SystemCharsets.UTF_8), "HmacSHA256");mac.init(secretKey);
byte[] byteHMAC = mac.doFinal(ts.getBytes(SystemCharsets.UTF_8));
byte[] sign = Base64.getEncoder().encode(byteHMAC); 例如:secret 为 2e3b71f5def64d95a727314f028bf5aa, ts为1547630863716时,签名结果应该为:6lFqepUu79KSxVCsrXyB/aLVFIdutsTLLx1cZjxDE4I=。
Agent Server发送Push给Agent Client响应消息:
其中,id:对应请求体id;resultId:对应请求体的result.id。
{
"id": "43667960-d455-4453-b0cf-1bae4955270d",
"resultId": "c295ea44-7543-4f78-b524-7a38915ad6e4",
"result": {
"code": "{{JSONRPCError错误码,整形类型}}",
"message": "{{JSONRPCError错误描述}}"
}
}