当无法在Firestore服务器本身上设置任何firestore时间戳时,如何将这些时间戳视为来自客户端SDK?
经过身份验证的用户是否可以破解自己的时间戳?如果客户端sdk不可靠,那么提供时间戳数据类型的重点是什么?这是否意味着我们必须使用Firebase Admin sdk在注册或需要时间戳的任何其他内容上创建用户数据?什么开发人员没有为每个数据集合添加时间戳?如果是这样,客户端sdk有什么意义?显然我错过了一些东西。
我从firebase客户端sdk尝试了这个,没有错误或时间戳;
myFirestoreReference.ref.set({
userId: firebaseUserCredential.user.uid,
created: this.$fireStore.FieldValue.serverTimestamp()
})
上面的代码成功创建了'userId',但没有创建'created'时间戳。
您可以在安全规则中检查时间戳的有效性。此规则要求客户端在写入“foo”集合的文档的created
字段中提供服务器时间戳令牌:
match /foo/{id} {
allow write: if request.resource.data.created == request.time;
}
request.time
是Firestore收到请求的时间,也是serverTimestamp()
在客户端生成的令牌所隐含的值。
我的答案是使用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)
});