我正在努力防止存储滥用。我的目标是每天限制用户的上传操作。因此,我在Finalize触发器上部署了存储,一旦文件发生冲突,该功能就会检测到使用Firestore的计数器达到或未达到极限。如果是,则将Millisec存储到CustomUserClaims中,如下所示:
//the user need to wait after this time to continue upload files (timeToUnlock = currentTime + additionalTime)
setCustomUserClaims(uid, {
timeToUnlock: 1570509112055
})
并在规则中进行比较
allow create: if request.time.toMillis() >= request.auth.token.timeToUnlock;
但是每次setCustomUserClaims时,我需要注销并再次登录客户端以更新声明,否则声明将不会仅保留以前的值就对其进行更新。我打印customClaims来控制台参数已更新,但规则中的参数似乎未更新。有更好的主意来解决这个问题?因为如果这不起作用,我不知道要阻止这种感谢。
console.log((await admin.auth().getUser(uid)).customClaims);
答案 0 :(得分:1)
您看到的是预期的行为。您用于更新声明的后端代码无法强制客户端立即查看这些声明。根据{{3}}:
在通过Admin SDK修改了用户的新声明后,它们是 通过ID传播到客户端上经过身份验证的用户 令牌的方式如下:
- 修改自定义声明后,用户登录或重新认证。结果发行的ID令牌将包含最新的 索赔。
- 现有用户会话的ID令牌在旧令牌过期后会刷新。
- 通过调用currentUser.getIdToken(true)强制刷新ID令牌。
最好的办法是编写客户端,以便服务器上的更改触发客户端上的更改,以强制刷新将使用新声明的ID令牌。但这并不一定会阻止客户端使用旧令牌,直到它最终到期。
如果要限制上传,则在每个存储上传上使用Cloud Functions触发器,检查是否应允许该文件,并在违反规则时删除该文件,将更加安全可靠。