SmartHomeApp调用Google Home reportState接口出现UNAUTHENTICATED未授权报错
问题核心根源
你踩了绝大多数刚接入Google智能家居上报功能的开发者都会碰到的坑:把两套完全独立的鉴权链路当成了一套。
- 你的服务能正常接收sync、query、execute、disconnect等各类指令回调,对应的是Google主动找你的服务发请求的鉴权逻辑:这套链路只需要在智能家居项目配置页填对回调地址、完成域名归属校验就行,整个过程你的服务不需要持有任何面向Google侧API的身份凭证。
- 你主动调用reportState上报状态的链路,是你的服务主动找Google的Home Graph服务发请求:这套链路和上面的入站鉴权完全隔离开,根本不会自动复用你配置的回调权限,必须单独给它配置带OAuth2权限的服务账号凭证,才能通过接口的身份校验。
为什么同一个SmartHomeApp实例还是调不通
你现在手里这个能正常接收入站指令的SmartHomeApp实例,初始化的时候只传了接回调需要的参数,压根没挂载出站调用要用的服务账号凭证。SDK内部执行reportState方法时,找不到可以用来凑请求头身份信息的有效OAuth2令牌,自然会被服务端打回来,抛出你看到的UNAUTHENTICATED异常。
你贴的那串ReportStateAndNotificationRequest的序列化结果逐行核对过,格式完全合规:requestId、agentUserId、设备状态的protobuf结构体结构都没有问题,这部分业务代码根本不用改。要记住agent_user_id只是请求体里的业务标识参数,和请求头里的鉴权信息半毛钱关系都没有,就算你把这个值填得完全正确,缺了请求头里的有效令牌照样过不了校验。
具体修复方法
初始化SmartHomeApp的时候,在配置项里传入你在对应云项目创建的、已经开通Home Graph API调用权限的服务账号密钥就行:
- SDK会自动用这套凭证完成OAuth2访问令牌的获取、过期自动刷新的全流程
- 后续所有reportState的调用,SDK都会自动把有效令牌注入请求头,不需要你写任何额外的认证拼接逻辑
- 配完凭证之后不需要改你现有的请求构建代码,直接重试上报就能正常通过校验
内容的提问来源于stack exchange,提问作者NateS
相关产品推荐
相关产品推荐

