我汇总了 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"
}
答案 0 :(得分:1)
当我们通过默认实例(即FirestoreOptions
)创建FirestoreOptions.getDefaultInstance().toBuilder()
时,我们将获得一个配置了“应用程序默认凭据”的生成器。这些凭据优先于您指定的服务帐户。使用FirestoreOptions.newBuilder()
可以避免这种情况。