Firebase自定义声明不会在规则中更新

时间:2019-10-08 04:52:07

标签: firebase firebase-authentication google-cloud-storage firebase-security firebase-admin

我正在努力防止存储滥用。我的目标是每天限制用户的上传操作。因此,我在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);

1 个答案:

答案 0 :(得分:1)

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

  

在通过Admin SDK修改了用户的新声明后,它们是   通过ID传播到客户端上经过身份验证的用户   令牌的方式如下:

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

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

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