尝试将Java客户端身份验证到Firestore时出现“凭据无法获取元数据”错误

时间:2018-10-12 04:17:31

标签: firebase firebase-authentication google-cloud-firestore

我汇总了 firestore Java客户端身份验证的世界,但始终与

无关。

警告:您的应用已使用Google Cloud SDK中的最终用户凭据进行了身份验证。我们建议大多数服务器应用程序改为使用服务帐户。如果您的应用程序继续使用Cloud SDK中的最终用户凭据,则可能会收到“超出配额”或“未启用API”错误。有关服务帐户的更多信息,请参见https://cloud.google.com/docs/authentication/。 凭据:ServiceAccountCredentials {clientId = 104986335035620796437,clientEmail=junkbot@nextbot3.iam.gserviceaccount.com,privateKeyId = 8e ... 11,transportFactoryClassName = com.google.auth.oauth2.OAuth2Utils $ DefaultHttpTransportFactory,tokenServerUri = https://oauth2.googleapis.com/token, scopes = [],serviceAccountUser = null} 线程“主”中的异常java.util.concurrent.ExecutionException:com.google.api.gax.rpc.UnavailableException:io.grpc.StatusRuntimeException: 不可用:凭据无法获取元数据

“凭据无法获取元数据”没有解释-我的服务帐户JSON是否错误?为什么它仍然会给我该警告,并且它们与之相关?

val firestoreOptions = FirestoreOptions.getDefaultInstance().toBuilder()
        .setProjectId("nextbot3")
        .setCredentials(GoogleCredentials.fromStream(ClassLoader.getSystemClassLoader().getResourceAsStream("serviceAccountKey.json")))
        .setDatabaseId("nextbot3")
        .setTimestampsInSnapshotsEnabled(true)
        .build()
println("Credentials: " + firestoreOptions.credentials)
val db = firestoreOptions.service!!

val docRef = db.collection("users").document("a-user").collection("devices").document("a-bot")
println(docRef.set(mapOf("hello" to "world")).get())

我的serviceAccountKey.json直接来自我从云(不是Firebase)项目管理页面下载的内容:

{
  "type": "service_account",
  "project_id": "nextbot3",
  "private_key_id": "8edf2b2607309e5da929109550090a5818cd8511",
  "private_key": "-----BEGIN PRIVATE KEY--...--END PRIVATE KEY-----\n",
  "client_email": "junkbot@nextbot3.iam.gserviceaccount.com",
  "client_id": "104986335035620796437",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/junkbot%40nextbot3.iam.gserviceaccount.com"
}

1 个答案:

答案 0 :(得分:1)

当我们通过默认实例(即FirestoreOptions)创建FirestoreOptions.getDefaultInstance().toBuilder()时,我们将获得一个配置了“应用程序默认凭据”的生成器。这些凭据优先于您指定的服务帐户。使用FirestoreOptions.newBuilder()可以避免这种情况。