ESP32连接Firestore出现OAuth2.0 access token -116错误如何解决
错误原因
串口返回的code: -116, mbedtls_pk_parse_key: PK - Invalid key tag or value是mbedTLS层的密钥解析失败错误,和网络连通性、Firestore权限规则无关,核心原因是传入SDK的OAuth2.0认证私钥格式不符合要求,常见触发场景包括:
- 复制服务账号私钥时遗漏了首尾的PEM格式标记行,即缺失
-----BEGIN PRIVATE KEY-----或-----END PRIVATE KEY----- - 私钥内容的换行被破坏:要么复制时把多行密钥粘成了无换行的一整行,要么代码里转义字符配置错误,导致SDK拿到的私钥结构不合法
- 误用了非服务账号类型的密钥:比如填入了Firebase Web端API Key、客户端应用配置密钥,这类密钥不是标准RSA PKCS#8格式私钥,无法被mbedTLS解析
- 依赖版本兼容问题:旧版Firebase-ESP-Client库、低于2.0.14版本的ESP32 Arduino核心内置的mbedTLS组件,无法正确解析2023年之后GCP新生成的服务账号私钥格式
- 私钥内容被污染:复制时多带入了空格、引号、转义符,或者下载的服务账号JSON文件本身损坏
修复步骤
按照以下顺序排查修复即可:
- 重新提取正确的服务账号私钥
打开你从Google Cloud/Firebase控制台下载的服务账号JSON文件,定位到private_key字段,完整复制字段的全部内容,必须保留首尾的PEM标记行,同时保留密钥内容的原有换行结构。如果是在Arduino代码中直接定义私钥字符串,建议用C++原始字符串字面量R"()"包裹私钥内容,避免手动转义换行导致的格式错误。注意:不要手动增删私钥里的任何字符,包括看起来多余的换行、短横线,任何改动都会导致私钥校验失败。
- 核对密钥类型
确认你使用的是服务账号等级的私钥,不是Firebase为Web、安卓、苹果端应用生成的客户端配置密钥,后者不属于服务端认证用的RSA私钥,无法用于OAuth2.0签名。 - 升级依赖版本
打开Arduino库管理器,将Firebase-ESP-Client升级到最新正式版;同时在开发板管理器中将ESP32 Arduino核心升级到2.0.14或更高版本,修复旧版mbedTLS组件的新格式密钥兼容问题。 - 校验配置项对应关系
对照示例代码的配置项,确认项目ID、服务账号邮箱、私钥三个核心参数分别填入了对应宏定义位置,不要出现字段错位(比如把服务账号邮箱填到私钥配置项里)。
内容的提问来源于stack exchange,提问作者Yóuxì
相关产品推荐
相关产品推荐

