Firebase自定义声明不会在规则[重复]中更新

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我正在努力防止存储滥用。我的目标是每天限制用户的上传操作。因此,我在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);
firebase firebase-authentication google-cloud-storage firebase-security-rules firebase-admin
1个回答
1
投票

您看到的是预期的行为。您用于更新声明的后端代码无法强制客户端立即查看这些声明。根据documentation

通过管理员SDK对用户修改新声明后,通过ID传播到客户端上经过身份验证的用户令牌通过以下方式:

  • 用户在修改自定义声明后登录或重新认证。结果发行的ID令牌将包含最新的索赔。
  • [现有用户会话的ID令牌在旧令牌过期后得到刷新。
  • 通过调用currentUser.getIdToken(true)强制刷新ID令牌。

您所能做的最好的就是编写客户端,以便服务器上的更改触发客户端上的更改,以强制刷新将使用新声明的ID令牌。但这并不一定会阻止客户端使用旧令牌,直到它最终到期为止。

如果要限制上传,则在每个存储上传上使用Cloud Functions触发器会更安全可靠,请检查是否应允许该文件,如果违反您的规则则将其删除。

© www.soinside.com 2019 - 2024. All rights reserved.