A2A 跨应用智能体通信:第三方技能互通权限管控实战
一、业务背景跨应用智能体传统互通安全痛点鸿蒙7 API26 基于AgentExtensionAbility提供原生端侧A2AAgent-to-Agent跨应用通信框架解决政企多应用协同、第三方技能互通四大安全与开发难题无标准化鉴权任意应用均可调用智能体旧方案无统一校验入口第三方恶意应用可随意连接本地Agent读取隐私技能数据管理员密码、病历、政务表单缺少调用白名单管控无法限定仅指定合作应用访问技能全部应用无差别放行不符合等保2.0最小访问权限规范通信无会话隔离、无指令分级拦截第三方应用可调用全部技能无法区分「查询类低风险指令」「修改/删除高风险指令」连接无生命周期管理内存泄漏、后台保活冲突多应用频繁连接/断开AgentExtensionAbility未做代理销毁、监听解绑商用7×24小时终端易出现服务卡死。A2A核心架构角色定义Agent服务端Server提供技能的应用注册AgentExtensionAbility对外暴露本地离线技能四则运算、备忘录、设备管控、国密解密Agent客户端Client第三方调用方应用通过wantAgent.connectAgent建立跨进程通信通道鉴权核心入口onAuth服务端唯一校验节点获取调用方包名、握手凭证实现白名单、分级权限拦截双向数据通道onData/sendData客户端下发指令、服务端返回技能执行结果支持长会话实时交互。二、工程全量前置配置服务端客户端双端2.1 通用kit依赖导入import{AgentExtensionAbility,wantAgent,common,Want}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;import{BusinessError}fromkit.BasicServicesKit;constTAGA2A_Agent_Security;constDOMAIN0x0017;2.2 权限声明两端必须配置互通权限module.json5增加跨智能体交互系统权限requestPermissions: [ { name: ohos.permission.INTERACT_WITH_AGENT, reason: $string:a2a_interact_skill, usedScene: { abilities: [EntryAbility], when: always } } ]2.3 服务端注册Agent扩展能力提供技能方extensionAbilities: [ { name: AgentExtService, srcEntry: ./ets/agentserver/AgentExtService.ets, type: agent, exported: true, // 必须true允许跨应用访问 description: 本地离线技能服务支持第三方A2A调用, metadata: [ { name: agent_config, value: $profile:agent_config.json } ] } ]2.4 agent_config.json 智能体基础配置resources/base/profile{agentCards:[{agentId:local_enterprise_agent_001,name:政企通用工具智能体,version:1.0.0,capabilities:{streaming:true},skills:[{id:skill_calc,name:四则运算查询,risk:low},{id:skill_note_query,name:备忘录读取,risk:low},{id:skill_brightness_set,name:屏幕亮度修改,risk:high},{id:skill_admin_pwd_decrypt,name:管理员密码解密,risk:high}]}]}三、服务端完整实现白名单鉴权分级技能权限管控文件路径ets/agentserver/AgentExtService.ets核心四层安全管控应用包名白名单拦截仅合作企业应用允许连接握手Token二次校验客户端携带预共享密钥握手技能风险分级拦截低风险查询放行高风险操作二次校验会话生命周期管理连接、断开日志全埋点防止内存泄漏。exportdefaultclassAgentExtServiceextendsAgentExtensionAbility{// 1. 可信第三方应用白名单仅允许这些包名A2A互通privatereadonlyALLOW_BUNDLE_LIST[com.enterprise.merchant,com.enterprise.gov.office];// 2. 预共享握手密钥政企多应用统一分发生产存入HUKS加密存储privatereadonlySHARED_HANDSHAKE_TOKENA2A_ENTERPRISE_2026_SECURE;// 高风险技能黑名单普通第三方禁止调用privatereadonlyHIGH_RISK_SKILL[skill_brightness_set,skill_admin_pwd_decrypt];onCreate():void{hilog.info(DOMAIN,TAG,A2A跨应用智能体服务启动就绪);}/** * A2A核心鉴权入口客户端发起连接时强制校验 * proxy通信代理对象可获取调用方信息、授权/拒绝连接 * handshakeData客户端携带的握手凭证预共享Token */onAuth(proxy:common.AgentHostProxy,handshakeData:string):void{// 步骤1获取发起调用的第三方应用包名constcallerBundleproxy.getCallerBundleName();hilog.info(DOMAIN,TAG,收到A2A连接请求调用方应用${callerBundle});// 校验1应用包名不在白名单直接拒绝连接if(!this.ALLOW_BUNDLE_LIST.includes(callerBundle)){proxy.authorize(deny:bundle_not_allow);hilog.warn(DOMAIN,TAG,非法应用${callerBundle}被拦截禁止A2A访问);return;}// 校验2握手Token不匹配拒绝连接if(handshakeData!this.SHARED_HANDSHAKE_TOKEN){proxy.authorize(deny:token_invalid);hilog.warn(DOMAIN,TAG,应用${callerBundle}握手密钥错误连接拒绝);return;}// 双重校验通过授予连接权限proxy.authorize(success);hilog.info(DOMAIN,TAG,可信应用${callerBundle}鉴权成功建立A2A通信会话);}/** * 接收第三方客户端下发指令执行技能并分级权限拦截 */onData(proxy:common.AgentHostProxy,inputRaw:string):void{constcallerBundleproxy.getCallerBundleName();letreq;try{reqJSON.parse(inputRaw);}catch{proxy.sendData(JSON.stringify({code:-1,msg:指令格式错误}));return;}constskillIdreq.skillId;constparamsreq.params;hilog.info(DOMAIN,TAG,A2A调用应用${callerBundle}请求技能${skillId});// 分级权限拦截高风险技能直接拒绝第三方调用if(this.HIGH_RISK_SKILL.includes(skillId)){constresJSON.stringify({code:403,msg:权限不足第三方应用禁止调用高风险修改类技能});proxy.sendData(res);return;}// 分发低风险技能执行constskillResultthis.dispatchSafeSkill(skillId,params);proxy.sendData(JSON.stringify({code:0,data:skillResult}));}/** 低风险安全技能执行逻辑 */privatedispatchSafeSkill(skillId:string,params:Recordstring,string):string{switch(skillId){caseskill_calc:{constexprparams.expr.replace(/[^0-9\\-\*\/\.]/g,);return计算结果${eval(expr)};}caseskill_note_query:{return备忘录列表1.鸿蒙A2A跨应用智能体开发 2.商用Kiosk锁机配置;}default:return未识别的安全技能ID;}}onDestroy():void{hilog.info(DOMAIN,TAG,A2A智能体服务销毁释放全部通信代理);}}四、客户端完整实现第三方应用发起A2A跨应用调用第三方合作应用页面携带握手Token建立跨应用连接下发标准化技能指令接收服务端返回结果。import{ComponentV2,Local}fromkit.ArkUI;import{wantAgent,common,Want}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;constTAGA2A_Client_Demo;// 服务端应用包名、Agent扩展Ability名称constSERVER_BUNDLEcom.enterprise.agent.server;constSERVER_AGENT_ABILITYAgentExtService;// 与服务端统一的握手凭证constHANDSHAKE_TOKENA2A_ENTERPRISE_2026_SECURE;EntryComponentV2struct A2AClientPage{LocalinputSkillId:stringskill_calc;LocalinputParam:string123*45;LocalreceiveMsg:string未连接跨应用智能体;privateagentProxy:common.AgentHostProxy|nullnull;privatetargetWant:Want{bundleName:SERVER_BUNDLE,abilityName:SERVER_AGENT_ABILITY};aboutToDisappear(){// 页面销毁强制断开A2A会话释放通信句柄this.disconnectAgent();}/** 建立A2A跨应用连接握手鉴权 */asyncconnectRemoteAgent(){try{this.agentProxyawaitwantAgent.connectAgent(this.targetWant,{// 握手数据服务端onAuth接收校验handshakeData:HANDSHAKE_TOKEN,onConnect:(proxy){this.receiveMsgA2A跨应用智能体连接成功可下发技能指令;// 监听服务端返回的技能执行结果proxy.on(data,(msg:string){this.receiveMsg服务端返回结果\n${msg};});},onDisconnect:(){this.agentProxynull;this.receiveMsgA2A跨应用会话已断开;}});}catch(err){consteerrasBusinessError;this.receiveMsgA2A连接失败${e.code}${e.message};hilog.error(0x0017,TAG,跨应用Agent连接异常${JSON.stringify(err)});}}/** 下发标准化技能指令给远端应用智能体 */sendSkillCommand(){if(!this.agentProxy||!this.inputSkillId.trim())return;// 标准化请求报文constsendBodyJSON.stringify({skillId:this.inputSkillId,params:{expr:this.inputParam}});this.agentProxy.sendData(sendBody);}/** 断开A2A跨应用通信会话 */disconnectAgent(){if(this.agentProxy){wantAgent.disconnectAgent(this.agentProxy);this.agentProxynull;}}build(){Column({space:20}){Text(A2A跨应用智能体第三方客户端调用演示).fontSize(22).fontWeight(FontWeight.Bold).margin({top:20});Text(this.receiveMsg).width(90%).padding(16).backgroundColor(#F0F7FF).borderRadius(12).fontSize(14).whiteSpace(WhiteSpace.PreWrap);Column({space:12}){Row({space:10}){Text(技能ID).width(80);TextInput({text:this.inputSkillId}).layoutWeight(1).onChange(vthis.inputSkillIdv);}Row({space:10}){Text(参数).width(80);TextInput({text:this.inputParam}).layoutWeight(1).onChange(vthis.inputParamv);}}.width(90%);Flex({wrap:FlexWrap.Wrap,gap:10}){Button(1.连接远端第三方智能体).onClick(()this.connectRemoteAgent());Button(2.下发技能指令).backgroundColor(#0A59F7).onClick(()this.sendSkillCommand());Button(3.断开A2A会话).backgroundColor(#888).onClick(()this.disconnectAgent());}.width(90%);Text(可用安全技能skill_calc、skill_note_query高风险技能第三方禁止调用).fontSize(12).fontColor(#888).margin({top:10});Blank();Text( 四层安全管控白名单应用校验握手Token技能分级拦截会话生命周期销毁).fontSize(12).fontColor(#AAAAAA).margin({bottom:30});}.width(100%).height(100%).padding({left:16,right:16}).backgroundColor(#F8F9FA);}}五、进阶安全加固方案政企商用必做5.1 握手Token存入HUKS硬件密钥托管禁止硬编码使用SecurityKit HUKS生成对称密钥握手Token从TEE安全区读取杜绝逆向抓取密钥// 伪代码从HUKS读取预共享握手凭证asyncfunctiongetA2AHandshakeToken():Promisestring{consttokenRawawaithuks.getData(a2a_handshake_key);returnnewTextDecoder().decode(tokenRaw);}5.2 高风险技能增加用户二次弹窗授权修改密码、文件删除、硬件管控等高风险指令即使在白名单内也需要本地用户弹窗确认后再执行。5.3 多应用动态白名单MDM远程下发政企批量终端搭配HEM设备管理平台远程更新ALLOW_BUNDLE_LIST白名单无需重新打包应用。5.4 A2A通信报文SM3哈希完整性校验客户端发送指令携带SM3摘要服务端校验报文未被篡改防止中间人篡改指令越权操作// 客户端发送报文附加hashconstrawJSON.stringify(body);consthashcryptoFramework.createMd(SM3).update(raw).digest();constsendPack{data:raw,sign:btoa(hash)};5.5 会话超时自动断开设置5分钟无通信自动断开agentProxy防止长期闲置会话被恶意劫持。六、高频商用开发踩坑完整排坑手册坑1connectAgent连接持续失败返回权限拒绝两端module.json5未声明ohos.permission.INTERACT_WITH_AGENT互通权限服务端AgentExtensionAbility未配置exported:true跨应用不可见bundleName、abilityName填写错误与服务端工程配置不匹配使用调试自动签名正式企业签名才允许跨应用Agent互通。坑2onAuth鉴权不触发第三方直接连接成功根因客户端connectAgent未传入handshakeData参数系统跳过握手校验修复客户端必须携带握手Token服务端才能进入onAuth鉴权流程。坑3白名单配置失效陌生应用仍可连接getCallerBundleName()获取包名大小写不匹配对比判断失效服务端未做全量字符串匹配存在模糊匹配漏洞规范包名全字符严格相等校验统一小写对比。坑4第三方可调用高风险隐私技能权限拦截失效根因技能分级判断写在onData分支末尾未提前拦截规范进入onData第一时间判断技能风险等级高风险直接返回403拒绝不执行业务逻辑。坑5页面反复连接Agent句柄泄漏、服务卡死解决方案页面aboutToDisappear强制调用wantAgent.disconnectAgent销毁代理商用7×24小时终端必须做资源回收。坑6模拟器无法调试A2A跨应用通信模拟器无跨进程Agent路由服务必须两台真机分别安装客户端、服务端应用同账号组网测试。坑7传输敏感明文数据存在泄露风险优化A2A传输前使用HUKS SM4加密报文跨进程仅传输密文服务端本地TEE解密后执行技能。七、政企商用生产级最佳实践四层安全标准化流程应用白名单校验 → 握手密钥Token校验 → 技能风险分级拦截 → 报文哈希完整性校验缺一不可最小权限原则第三方仅开放查询类低风险技能修改、解密、硬件管控等高风险技能仅允许自身应用调用全链路操作审计日志A2A连接建立/断开、鉴权成功/拒绝、技能调用、指令参数全部打印hilog安全事件可追溯离线无网络兼容A2A端侧通信完全本地进程交互不依赖云端适配政务、门店断网自助终端多智能体协同兼容A2A可搭配DistributedMultiKit多端同步、Kiosk锁机、本地AgentExtensionAbility技能体系形成完整政企端侧AI协同方案签名强绑定隔离Agent服务与应用签名证书绑定其他同名包签名不一致无法通过鉴权防止仿冒应用劫持A2A通道。八、方案总结鸿蒙7端侧A2A跨应用智能体通信基于AgentExtensionAbility实现标准化第三方技能互通依托onAuth统一鉴权入口构建白名单应用管控、握手密钥校验、技能分级权限拦截三层核心安全体系彻底解决第三方应用随意访问本地隐私技能、越权操作等政企合规痛点。整套方案纯本地端侧运行、无网络依赖支持双向长会话实时交互适配政务多应用协同、零售门店多终端技能互通、企业内部工具联动等商用场景是鸿蒙跨应用智能体互通的安全标准化落地方案。