我使用新用户注册时创建的自定义声明来保护自己的路线。
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更新-我的所有尝试均失败。
有什么想法吗?
答案 0 :(得分:1)
要在JavaScript 客户端中刷新令牌,请执行以下操作:
user.getIdToken(true)
如果您的客户端在其他平台上运行,则对所有其他平台都有等效的调用。但是无论使用哪种平台,您都需要进行此调用以刷新用户的令牌,以便获取新的/更新的声明。
执行此操作完全独立于Firebase的任何其他功能,因此它不依赖于实时数据库或Firestore。
您共享的JavaScript代码不会刷新客户端中的自定义声明,而是要在设置自定义声明的受信任环境中运行。该代码仅在上次更新用户配置文件时在实时数据库中标记。
然后,您将在客户端上运行另一段代码,以侦听此数据库值,并在数据库标志更改时强制客户端刷新用户的ID令牌。
该代码位于您在Client side implementation (JavaScript)下共享的同一文档页面中。