当无法在Firestore服务器本身上设置任何Firestore时间戳时,来自客户端SDK的Firestore时间戳如何被视为有效?
经过身份验证的用户可以破解自己的时间戳记吗?如果客户端sdk不可靠,则提供时间戳数据类型有什么意义呢?这是否意味着我们必须使用Firebase Admin sdk在注册时或其他需要时间戳记的情况下创建用户数据?哪个开发人员没有在每个数据收集上添加时间戳?如果是这样,客户端SDK的意义是什么?显然我缺少了一些东西。
我从Firebase客户端sdk尝试了此操作,没有错误或时间戳;
myFirestoreReference.ref.set({
userId: firebaseUserCredential.user.uid,
created: this.$fireStore.FieldValue.serverTimestamp()
})
上面的代码成功创建了'userId',但没有创建'时间戳'。
答案 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)
});