如何在Firestore中创建带有可靠时间戳记的文档?

时间:2019-03-23 18:20:54

标签: javascript firebase timestamp google-cloud-firestore

当无法在Firestore服务器本身上设置任何Firestore时间戳时,来自客户端SDK的Firestore时间戳如何被视为有效?

经过身份验证的用户可以破解自己的时间戳记吗?如果客户端sdk不可靠,则提供时间戳数据类型有什么意义呢?这是否意味着我们必须使用Firebase Admin sdk在注册时或其他需要时间戳记的情况下创建用户数据?哪个开发人员没有在每个数据收集上添加时间戳?如果是这样,客户端SDK的意义是什么?显然我缺少了一些东西。

我从Firebase客户端sdk尝试了此操作,没有错误或时间戳;

myFirestoreReference.ref.set({
  userId: firebaseUserCredential.user.uid,
  created: this.$fireStore.FieldValue.serverTimestamp()
})

上面的代码成功创建了'userId',但没有创建'时间戳'。

2 个答案:

答案 0 :(得分:2)

您可以检查安全规则中时间戳的有效性。此规则要求客户端在要写入“ foo”集合的文档的created字段中提供服务器时间戳记令牌。

match /foo/{id} {
    allow write: if request.resource.data.created == request.time;
}

request.time是Firestore收到请求的时间,也是serverTimestamp()在客户端上生成的令牌所隐含的值。

答案 1 :(得分:0)

我的答案是使用Firebase Admin sdk在api中的服务器上使用以下代码。这是我一直在寻找但至今未找到的示例。下面列出的代码演示了...

的用法

Firebase Admin sdk => FireStore

之所以可靠,是因为它是通过Firebase Admin sdk来自我的服务器,而不是Firebase Client sdk,此外serverTimestamp()是由FireStore服务器设置的,而不是我的网络服务器设置的(通过'new Date()')或发出原始请求的客户端计算机。我能够通过以下示例推论得出这个答案。

Firebase Client sdk => FireStore https://firebase.google.com/docs/firestore/manage-data/add-data

Firebase Admin SDK => Firebase身份验证 https://firebase.google.com/docs/auth/admin/manage-users

var admin = require('firebase-admin');

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: MY_FIREBASE_PROJECT_ID, 
    clientEmail: MY_FIREBASE_CLIENT_EMAIL,
    privateKey: MY_FIREBASE_PRIVATE_KEY,
  }),
  databaseURL: MY_FIREBASE_DATABASE_URL
});


var serverTimestamp = admin.firestore.FieldValue.serverTimestamp()    

admin.firestore().collection('someFireStoreCollection').doc(someFireStoreCollectionId).update({
  someDateField: serverTimestamp
}).then(function() {
  console.log("Successfully updated FireStore");
}).catch(function(error) {
  console.log("Error updating FireStore:", error);
  throw(error)
});