Firebase Firestore时间戳和基于请求时间的安全规则

Firebase Firestore时间戳和基于请求时间的安全规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正在尝试根据request.time获取实体列表。获取单个实体成功,而列表失败。当安全规则如此复杂时,您能告诉我如何为WebSDK查询编写where子句吗 有效: /timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup /timer/2339mdynya9Ii358l7DS/smallTimers firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o

我正在尝试根据request.time获取实体列表。获取单个实体成功,而列表失败。当安全规则如此复杂时,您能告诉我如何为WebSDK查询编写where子句吗

有效

/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup
/timer/2339mdynya9Ii358l7DS/smallTimers
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup`);
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers`);
match /timers/{timerId} {
  match /smallTimers/{smallTimerId} {
    allow read, list: getTimer(timerId).createdAt.toMillis() + resource.data.startAfter < request.time.toMillis();
  }
}
function getTimer(timerId) {
  return get(/databases/$(database)/documents/times/$(timerId)).data
}
FirebaseError:缺少或权限不足。

/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup
/timer/2339mdynya9Ii358l7DS/smallTimers
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup`);
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers`);
match /timers/{timerId} {
  match /smallTimers/{smallTimerId} {
    allow read, list: getTimer(timerId).createdAt.toMillis() + resource.data.startAfter < request.time.toMillis();
  }
}
function getTimer(timerId) {
  return get(/databases/$(database)/documents/times/$(timerId)).data
}
工作抓取程序代码(无规则测试)

/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup
/timer/2339mdynya9Ii358l7DS/smallTimers
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup`);
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers`);
match /timers/{timerId} {
  match /smallTimers/{smallTimerId} {
    allow read, list: getTimer(timerId).createdAt.toMillis() + resource.data.startAfter < request.time.toMillis();
  }
}
function getTimer(timerId) {
  return get(/databases/$(database)/documents/times/$(timerId)).data
}
我的结构

/timer/2339mdynya9Ii358l7DS 
{
  createdAt: "May 12, 2018 at 5:44:51 PM UTC+2"
}
/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup
{
  startAfter: 180000
}
我的firestore规则

/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup
/timer/2339mdynya9Ii358l7DS/smallTimers
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers/15TUTTv6o5dbOZyVEPup`);
firestore.get(`/timer/2339mdynya9Ii358l7DS/smallTimers`);
match /timers/{timerId} {
  match /smallTimers/{smallTimerId} {
    allow read, list: getTimer(timerId).createdAt.toMillis() + resource.data.startAfter < request.time.toMillis();
  }
}
function getTimer(timerId) {
  return get(/databases/$(database)/documents/times/$(timerId)).data
}
match/timers/{timerId}{
匹配/smallTimers/{smallTimerId}{
允许读取,列表:getTimer(timerId.createdAt.toMillis()+resource.data.startAfter

p.S.毫秒时间匹配并测试正确(提取单个实体证明)

找到这个问题了吗?是的-