如何在Firestore中使用可靠的时间戳创建文档?

问题描述 投票:0回答:2

当无法在Firestore服务器本身上设置任何firestore时间戳时,如何将这些时间戳视为来自客户端SDK?

经过身份验证的用户是否可以破解自己的时间戳?如果客户端sdk不可靠,那么提供时间戳数据类型的重点是什么?这是否意味着我们必须使用Firebase Admin sdk在注册或需要时间戳的任何其他内容上创建用户数据?什么开发人员没有为每个数据集合添加时间戳?如果是这样,客户端sdk有什么意义?显然我错过了一些东西。

我从firebase客户端sdk尝试了这个,没有错误或时间戳;

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

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

javascript firebase timestamp google-cloud-firestore
2个回答
2
投票

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

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

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


0
投票

我的答案是使用Firebase Admin sdk在我的服务器上使用以下代码。这是我正在寻找但迄今为止从未找到过的例子。下面列出的代码演示了......的使用

Firebase管理员sdk => FireStore

这是可靠的,因为它来自我的服务器通过Firebase Admin sdk而不是Firebase客户端sdk,此外serverTimestamp()由FireStore服务器而不是我的网络服务器(通过'new Date()')或客户端机器设置提出原始请求。通过从......的例子中推断,我能够实现这个答案。

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

Firebase管理员sdk => Firebase Auth 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)
});
© www.soinside.com 2019 - 2024. All rights reserved.