首页 > 解决方案 > Firestore 自定义声明未更新 UI

问题描述

我正在使用新用户注册时创建的自定义声明来保护我的路线。

allow read, write: if resource.data.ownerId == request.auth.uid;

但是,当新用户注册时,它不会更新 UI 的自定义声明!这意味着新用户无法访问内容,除非他注销并再次登录,这是一种非常糟糕的体验。

在文档中,firebase 团队表示他们可以使用以下命令强制更新 UI:

const metadataRef = admin.database().ref("metadata/" + user.uid);
return metadataRef.set({refreshTime: new Date().getTime()});

https://firebase.google.com/docs/auth/admin/custom-claims

我在前端/后端都遵循了代码,但我认为此代码仅适用于实时数据库,而不适用于 firestore。文档中没有强制 UI 使用 firestore 更新的代码 - 我的所有尝试都失败了。

有任何想法吗?

标签: javascriptfirebasegoogle-cloud-firestorefirebase-security

解决方案


要在 JavaScript客户端中刷新令牌,请执行以下操作:

user.getIdToken(true)

所有其他平台都有等效的调用,以防您的客户端在这些平台上运行。但无论平台如何,您都需要进行此调用以刷新用户的令牌,以便它获取新的/更新的声明。

这样做完全独立于任何其他 Firebase 功能,因此它不依赖于实时数据库或 Firestore。


您共享的 JavaScript 代码不会刷新客户端中的自定义声明,而是在您设置自定义声明的受信任环境上运行。该代码仅在用户配置文件最后一次更新时在实时数据库中进行标记。

然后,您将在客户端上运行另一段代码来侦听此数据库值,并在数据库标志更改时强制客户端刷新用户的 ID 令牌。

该代码位于您在Client side implementation (JavaScript)下共享的同一文档页面中。


推荐阅读