firebase 如何确保Firestore安全规则只接受Firestore时间戳而不接受Javascript日期

waxmsbnn  于 2023-05-01  发布在  Java
关注(0)|答案(1)|浏览(138)

我正在尝试验证我的输入作为我的firestore规则的一部分。
假设我有一个用户文档,它是一个简单的对象,包含Firestore时间戳,文档ID是uid。我正在为我的规则编写单元测试,并希望区分如下有效的测试:

{ creationDate: FirestoreTimestamp.fromDate(new Date()) }

和一个无效的像这样:

{ creationDate: new Date() }

我的firestore.rules有这个规则:

match /users/{userId} {
    allow create: if (creationDate != null && creationDate is timestamp)
}

我正在编写单元测试来验证我的规则,并希望确保Firestore Timestamps是唯一有效的输入。
所以我写了一个单元测试,我们给这个字段分配了一个不同类型的时间值,这个单元测试预计会失败:

it('Fails if creationDate is not a Firestore timestamp', async () => {
                // Arrange
                const authedUser = testEnv.authenticatedContext(myId);
                const db = authedUser.firestore();
                const docRef = doc(db, 'users', myId);
                const docData = { dateCreated: new Date()};

                // Act & Assert
                await assertFails(setDoc(docRef, docData));
});

但它不起作用。当我运行测试时,我得到错误Error: Expected request to fail, but it succeeded.

m0rkklqb

m0rkklqb1#

客户端希望此字段具有Firestore Timestamp类型。
如果您将TimestampDate值传递给Firestore,它将存储为Timestamp值。所以你给予的代码:

creationDate: FirestoreTimestamp.fromDate(new Date())

具有与以下相同的结果:

creationDate: new Date()

如果希望以纳秒精度存储该值,则应用途:

creationDate: FirestoreTimestamp.now()

如果您从Timestamp字段中检索该值,则它将作为Timestamp对象返回,如果需要,您可以从中获取Date值。
因此,即使最初传入了一个Date对象,从数据库返回的值也将是一个Timestamp对象。

相关问题