如何用Terraform生成Firebase Auth的AdminSDK(ADC)凭证?
问题概述
尝试通过Terraform搭建Google项目,后端需调用Firebase Auth做身份验证,需要自动化生成Firebase控制台下载的Admin SDK私钥文件,编写了Terraform代码但存在三个疑问。
疑问解答
1. client_x509_cert_url字段差异
Firebase控制台生成的文件中该字段可能使用项目专属路径格式,但你通过Terraform构造的URL(https://www.googleapis.com/robot/v1/metadata/x509/${service_account_email})是Google服务账户证书的标准端点,完全有效且符合规范。两者指向同一服务账户的X509证书,功能上无区别,无需担心兼容性问题。
2. 私钥格式与长度差异
你的代码中手动给私钥添加了-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----标记及换行符,但实际上当private_key_type设为TYPE_GOOGLE_CREDENTIALS_FILE时,google_service_account_key资源返回的private_key已经是包含正确换行和标记的完整PEM格式私钥。重复添加标记会导致格式错误,进而出现长度差异。
修正方法:移除手动添加的标记和换行,直接使用资源返回的private_key值即可。
3. Admin SDK文件与ADC的关系及格式兼容性
- Firebase Admin SDK的凭证文件本质就是Google Application Default Credentials (ADC) 的一种形式,两者格式完全兼容。
- 你构造的JSON格式符合ADC要求,但更推荐直接使用Terraform资源生成的完整JSON,避免手动构造可能出现的字段遗漏或格式错误。
优化后的Terraform代码
无需手动构造JSON,直接利用google_service_account_key返回的完整凭证内容:
resource "google_service_account" "sa_backend_firebase_adminsdk" { account_id = "sa-backend-firebase-adminsdk" display_name = "Backend Firebase SDK SA" project = var.GCLOUD_PROJECT_ID } resource "google_service_account_key" "sa_backend_firebase_adminsdk_key" { service_account_id = google_service_account.sa_backend_firebase_adminsdk.name private_key_type = "TYPE_GOOGLE_CREDENTIALS_FILE" # 此类型返回完整JSON凭证 } resource "local_sensitive_file" "sa_backend_firebase_adminsdk_private_key_file" { content = google_service_account_key.sa_backend_firebase_adminsdk_key.private_key filename = "${path.module}/${var.GCLOUD_PROJECT_NAME}-private-key.json" }
该代码会生成与Firebase控制台下载完全一致的凭证文件,自动包含所有正确字段和格式,解决你遇到的所有格式差异问题。
内容的提问来源于stack exchange,提问作者Ndrslmpk

