首页 > 解决方案 > 启用“setTimestampsInSnapshotsEnabled”后的服务帐户身份验证警告

问题描述

问题

根据 Firebase Timestamp警告将我的 AppEngine 托管应用程序的Date对象更新为Timestamp对象并启用有关使用服务身份验证帐户的新警告后显示。setTimestampsInSnapshotsEnabled

但是,我目前在根据Initialize Cloud Firestore子部分initialize on your own server部分下的文档初始化 Firebase 时使用服务身份验证帐户。尽管有的警告消息,该应用程序仍按预期工作。

原始“setTimestampsInSnapshotsEnabled”警告

存储在 Firestore 中的 java.util.Date 对象的行为将发生变化,您的应用程序可能会中断。要隐藏此警告并确保您的应用不会中断,您需要在调用任何其他 Cloud Firestore 方法之前将以下代码添加到您的应用中:

FirestoreOptions options = FirestoreOptions.newBuilder().setTimestampsInSnapshotsEnabled(true).build();
Firestore firestore = options.getService();

通过此更改,存储在 Cloud Firestore 中的时间戳将作为 com.google.cloud.Timestamp 对象而不是系统 java.util.Date 对象读回。因此,您还需要将期望 java.util.Date 的代码更新为期望时间戳。例如:

// Old:
java.util.Date date = (java.util.Date) 
snapshot.get("created_at");
// New:
Timestamp timestamp = (Timestamp) 
snapshot.get("created_at");
java.util.Date date = timestamp.toDate();

请在启用新行为时审核 java.util.Date 的所有现有用法。在未来的版本中,该行为将更改为新行为,因此如果您不遵循这些步骤,您的应用程序可能会中断。

新服务帐户身份验证警告

2018 年 12 月 9 日下午 12:54:39 com.google.auth.oauth2.DefaultCredentialsProvider warnAboutProblematicCredentials 警告:您的应用程序已使用来自 Google Cloud SDK 的最终用户凭据进行身份验证。我们建议大多数服务器应用程序改用服务帐户。如果您的应用程序继续使用来自 Cloud SDK 的最终用户凭据,您可能会收到“超出配额”或“API 未启用”错误。有关服务帐户的更多信息,请参阅https://cloud.google.com/docs/authentication/

设置

初始化 Firebase

FirebaseApp.initializeApp(FirebaseOptions.Builder()
    .setCredentials(
        fromStream(Gson().toJson(FirebaseCredentialsHelper.get()).byteInputStream()))
    .setFirestoreOptions(FirestoreOptions.newBuilder()
    .setTimestampsInSnapshotsEnabled(true).build())
    .build())

服务凭证对象

FirebaseCredentialsHelper返回服务帐户凭据,具体取决于应用是在暂存模式还是在生产模式下构建。

return FirebaseCredentials(
                "service_account",
                "[project-id]",
                "[private-key-id]",
                "[private-key]",
                "[client-email]",
                "[client-id]",
                "https://accounts.google.com/o/oauth2/auth",
                "https://accounts.google.com/o/oauth2/token",
                "https://www.googleapis.com/oauth2/v1/certs",
                "[client-x509-cert-url]"
        )

标签: javafirebasegoogle-cloud-firestore

解决方案


推荐阅读