我的Firebase数据库中有一个adminContent节点,如果用户将admin设置为true作为自定义声明,则该节点应该只能读/写。
以下代码显示我的一个测试用户HAS admin设置为true作为声明而一个测试用户没有(因此问题似乎没有正确设置声明):
/* Check if admin */
firebase.auth().currentUser.getIdTokenResult().then(function(idTokenResult) {
if (idTokenResult.claims.admin) {
// THIS PART IS EXECUTED
}
});
这些是我的规则:
{
"rules": {
"metadata": {
"$user_id": {
// Read access only granted to the authenticated user.
".read": "$user_id === auth.uid",
// Write access only via Admin SDK.
".write": false
}
},
"adminContent": {
".read": "auth.token.admin === true",
".write": "auth.token.admin === true",
}
}
}
两个测试用户(一个有admin声明,一个没有)都能读写adminContent。当我使用两个用户的UID在Firebase控制台上的规则下测试模拟器时,没有人获得许可。
数据结构如下:
adminContent
adminEmails
announcements
metadata
...
users
...
我的规则有什么问题吗?为什么模拟器和真实场景不同?
答案 0 :(得分:0)
令牌可能已过时,即。在发出ID令牌后设置了自定义声明。令牌生存期为1小时。因此,在下次刷新之前,令牌将不会获取最新的声明。通过调用以下方法设置自定义声明后,您可以强制刷新它:
firebase.auth().currentUser.getIdTokenResult(true)...