Account Kit 在 HarmonyOS 7 开放客户端与服务端 Skills,可辅助生成一键登录页面、工程配置以及授权码换取用户信息的服务端代码。生成结果仍需开发者审查与真机验证。
账号接入横跨 ArkTS 页面、权限、签名、Client ID、服务端接口、用户主键和隐私合规。传统复制示例的做法容易漏配置,也容易把令牌处理错误地放到客户端。Account Kit Skill 把标准步骤交给 AI 编码工具执行,但它不会替团队决定账户模型。
本文把一次“一键登录接入”拆成前置检查、客户端生成、服务端生成、差异审查、身份映射和端到端验证。
一、两个 Skill 负责两段工作
官方文档给出两个能力:hmos-account-kit-quicklogin-client生成 ArkTS 一键登录页面、工程依赖、权限与跳转;hmos-account-kit-quicklogin-server生成 Java 服务端工程,处理授权码换取用户信息。
客户端和服务端应该分别执行任务,分别审查。一次提示同时修改两端,会让权限、密钥与业务文件混在同一差异中。
二、接入前先冻结边界
在让 AI 修改代码前,明确:目标模块、允许修改的配置、登录成功路由、已有会话接口、服务端语言、禁止读取的密钥目录、必须执行的检查和回滚方式。
目标:entry 模块接入华为账号一键登录 允许:登录页面、路由适配、module.json5、oh-package 依赖 禁止:业务首页、支付模块、签名材料、生产密钥 验证:语法检查、构建、真机首次登录、取消与账号切换没有边界的 AI 指令很容易生成一个“能演示、不能合并”的登录页。
三、确认 Skill 与 MCP 真正生效
官方建议先验证 AI 工具能够命中 Skill,并检查 DevEco MCP 连接。若输入“帮我接入登录”后工具直接自由编写代码,而没有执行 Skill 前置检查,就不应继续。
使用 "hmos-account-kit-quicklogin-client" Skill, 在 entry 模块接入华为账号一键登录。 复用现有 LoginViewModel,不修改首页和支付模块; 生成后列出修改文件、人工配置项和验证命令。强制名称触发更容易审计,也能减少模型凭经验猜 API。
四、客户端生成后的审查重点
检查依赖版本是否与工程 SDK 一致,权限是否最小,Client ID 是否使用配置项,登录按钮与页面生命周期是否正确,取消与失败是否恢复可操作状态。
typeLoginState=|{kind:'idle'}|{kind:'authorizing';requestId:string}|{kind:'exchanging';requestId:string}|{kind:'signed-in';userId:string}|{kind:'cancelled'}|{kind:'failed';code:string;retryable:boolean}classLoginCoordinator{privaterequestId=''asyncstart(){constid=crypto.randomUUID()this.requestId=idconstauthCode=awaitaccountAdapter.authorize()if(id!==this.requestId)returnconstsession=awaitbackend.exchange(authCode)if(id!==this.requestId)returnstore.signedIn(session.userId)}}快速重复点击、页面退出和账号切换会产生迟到结果,requestId 用于保证只有当前链路能落地。
五、授权码只能交给服务端
客户端获取一次性授权结果后,交给受控业务服务端。服务端验证请求、交换用户信息、映射内部用户并签发自己的会话。Client Secret、服务端 Token 和生产配置不能进入客户端、提示词或代码仓库。
publicSessionResultexchange(LoginCommandcommand){IdempotentResultcached=resultStore.find(command.requestId());if(cached!=null)returncached.session();HuaweiAccountaccount=accountClient.exchange(command.authorizationCode());InternalUseruser=identityService.resolve(account.getOpenId(),account.getUnionId());SessionResultresult=sessionService.issue(user.getId());resultStore.save(command.requestId(),result);returnresult;}这是服务端分层示例,不替代官方接口。授权码过期、重复交换、服务不可用和账号受限都要返回稳定错误码。
六、用户主键不能直接用手机号
手机号可能变化、为空或以匿名形式返回。团队应明确 OpenID、UnionID 与内部 userId 的映射边界。不同开发者、不同应用和跨端场景的标识范围不同,不能凭字段名猜测全局唯一性。
interfaceIdentityBinding{provider:'huawei-account'appScopeOpenId:stringunionId?:stringinternalUserId:stringboundAt:number}账号合并、解绑和注销要走受控流程,避免同一个外部身份绑定两个内部用户。
七、会话存储与退出
客户端只保存业务会话所需的最小凭据,并使用安全存储。退出登录时清理本地会话、用户缓存和页面栈;服务端撤销或失效会话。系统账号切换事件到来后,应用重新验证绑定关系,不能继续展示前一个账户的数据。
八、错误语义要可恢复
至少区分:用户取消、网络超时、授权码过期、服务端拒绝、配置错误、账号受限和内部异常。用户取消不应显示红色错误;配置错误不可无限重试;网络超时允许保留当前页面并重试。
functionmapLoginError(error:LoginError):LoginViewState{switch(error.kind){case'UserCancelled':return{message:'',retryable:true}case'NetworkTimeout':return{message:'网络暂不可用',retryable:true}case'InvalidClientConfig':return{message:'登录配置异常',retryable:false}default:return{message:'登录失败,请稍后重试',retryable:false}}}九、生成代码的安全检查
审查 Skill 新增的每个文件,确认没有硬编码密钥、扩大权限、引入未知依赖、绕过现有架构或记录敏感信息。生成的服务端示例要接入项目统一的鉴权、限流、日志脱敏和错误处理。
不要把“Skill 执行成功”当成“登录接入完成”。工具输出只能证明生成过程结束,不能证明真实账号链路可用。
十、端到端测试矩阵
describe('LoginCoordinator',()=>{it('ignores stale authorization result',async()=>{coordinator.start()coordinator.start()awaitaccountAdapter.finishFirstRequest()expect(store.state.kind).not.toBe('signed-in')})it('does not create two users for duplicated request',async()=>{consta=awaitbackend.exchange(fixtureCommand)constb=awaitbackend.exchange(fixtureCommand)expect(b.userId).toBe(a.userId)})})真机覆盖首次登录、取消、授权码过期、重复点击、账号切换、退出、弱网、服务端 5xx、应用后台和进程恢复。
十一、交付证据
保留 Skill 名称与版本、修改文件清单、依赖与权限差异、构建日志、服务端测试、真机录屏和回滚说明。密钥只记录配置项名称,不记录真实值。
十二、上线清单
- 客户端与服务端 Skill 分别执行并审查;
- 指令写清目标、允许范围和禁区;
- Client Secret 与服务端 Token 从未进入客户端;
- OpenID、UnionID 和内部 userId 映射明确;
- 重复请求与迟到回调安全处理;
- 退出和账号切换清理完整;
- 错误码可解释、可恢复;
- 构建、服务端测试和真机登录都有证据。
结语
Account Kit Skill 的价值,是把高频接入步骤变成可重复的 AI 工程流程。真正的完成标准仍是修改范围可审查、秘密留在服务端、身份映射稳定、异常可恢复,并通过端到端真机验证。
官方参考
- Account Kit Skill 能力开放:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/account-skill
- 2026 年 6 月开发者月刊:https://developer.huawei.com/consumer/cn/monthly/202606