Xamarin Mono初始化Cloud Firestore时Build()抛出InvalidDataException
问题说明
- 参考Firestore凭据结合配置初始化的方案执行Firebase凭据序列化,该步骤运行无异常
- 编写如下代码创建Firestore数据库实例时,在Build方法执行环节触发程序崩溃:
string firebaseJson = fsi.Serialize(); // 该步骤运行正常 FirestoreDbBuilder fsDBBuilder = new FirestoreDbBuilder { ProjectId = fbSettings.ProjectId, JsonCredentials = firebaseJson // 服务账号JSON文件内容 }; // 该步骤运行正常 FirestoreDb db = fsDBBuilder.Build(); // 该行触发程序崩溃
- 抛出异常信息:
System.IO.InvalidDataException: 'Invalid sequence, too long.' - 从异常堆栈可以定位到,错误发生在Google Auth库解析PKCS8格式RSA私钥的环节。
问题根因
这个报错没有特殊场景,本质是SDK读取到的服务账号私钥不符合PKCS8格式要求,99%的情况都是序列化/存储/读取凭据的过程中把JSON内容改坏了,常见触发原因:
- 私钥中的换行符被错误处理:服务账号私钥为PEM格式,换行是格式强制要求,很多人在序列化、存配置的时候会把私钥字符串里的转义换行
\n处理成字面量\\n,或者直接删除所有换行把内容拼成一整行,SDK解析时无法识别合法的ASN1结构,就会抛出该异常。 - 私钥内容被污染:序列化、转码过程中私钥被截断,或者混入多余的转义字符、空格,比如做了HTML/XML转义修改了特殊字符。
- 凭据类型错误:误将客户端/Web端使用的Firebase公开配置当成服务账号凭据传入,这类配置里没有合法的PKCS8私钥字段。
- 极少数情况为旧版Google.Apis.Auth依赖包存在私钥解析兼容bug。
解决步骤
- 先做基准测试排除SDK问题:跳过自定义的序列化逻辑,直接把从谷歌云控制台下载的原始服务账号JSON文件路径赋值给
FirestoreDbBuilder.CredentialsPath属性,不传入JsonCredentials参数,执行Build方法。如果这步能正常运行,可100%确认问题出在自定义的凭据处理逻辑,和SDK本身无关。 - 断点校验序列化后的凭据内容:在Build行前断点查看
firebaseJson变量的完整内容,重点检查private_key字段:- 字段值必须以
-----BEGIN PRIVATE KEY-----开头,以-----END PRIVATE KEY-----结尾 - 两个标识中间的Base64内容需按每64字符保留换行,不能拼接为单行
- 如果内容中出现
\\n形式的双反斜杠加n字符,全局替换为实际换行符\n即可
- 字段值必须以
- 简化凭据处理逻辑:没有特殊需求的话,直接读取原始服务账号JSON文件的全量字符串赋值给JsonCredentials即可,不要对内容做多余的转义、格式化处理,等流程跑通后再逐步调整配置存储方案。
- 如果基准测试用原始凭据文件也报错,直接将项目中Google.Cloud.Firestore、Google.Apis.Auth相关的所有NuGet包升级到最新稳定版,排除版本兼容问题。
内容的提问来源于stack exchange,提问作者Sam Mazza
相关产品推荐
相关产品推荐

