我正在努力解决firebase自定义声明。
我已经测试了很多方法,但是没有用。显然,我错过了概念本身中的一些重要内容。
所以我回到了原点。 Google示例中的此脚本应将海关规则应用于新创建的用户
exports.processSignUp = functions.auth.user().onCreate(event => {
const user = event.data; // The Firebase user.
const customClaims = {
param: true,
accessLevel: 9
};
// Set custom user claims on this newly created user.
return admin.auth().setCustomUserClaims(user.uid, customClaims)
});
然后在客户端上,我用
检查结果firebase.auth().currentUser.getIdTokenResult()
.then((idTokenResult) => {
// Confirm the user is an Admin.
console.log(idTokenResult.claims)
if (!!idTokenResult.claims.param) {
// Show admin UI.
console.log("param")
} else {
// Show regular user UI.
console.log("no param")
}
})
.catch((error) => {
console.log(error);
});
所有仅原始复制粘贴仍然无效。我已经在本地计算机上进行了测试(cors可能有问题吗?)并已部署
答案 0 :(得分:2)
这是比赛情况。如果该函数先结束,那么您将获得更新的数据。
getIdTokenResult
方法确实会强制刷新,但是如果自定义声明尚未准备好,那就没有意义了。
您需要设置另一个数据控制结构以触发客户端上的强制刷新。例如,通过实时听众收听rtd;
root.child(`permissions/${uid}`).on..
监听器内部的逻辑为:if the value for that node exist and is a number greater than some threshold, then trigger the user auth refresh
在此期间,如果没有数据快照,则ui可以反映加载状态;如果存在数据快照但权限级别较低,则ui可以反映为非管理员视图。
在“函数”中,必须在设置索赔后设置节点:
..setCustomUserClaims(..).then(
ref.setValue(9)
);
我在pastebin
上有一个更详细的示例答案 1 :(得分:1)
当客户端从服务器获取ID令牌时,将填充对客户端的声明。 ID令牌的有效期为一个小时,然后SDK会自动刷新它。
在调用Cloud Functions auth.user().onCreate
时,客户端已经获得了新用户的ID令牌。这意味着客户最多可能需要一个小时才能看到更新的声明。
如果您希望客户在此之前获得自定义声明,可以force it to refresh the token。但是在this video中,我们的安全专家建议(您考虑)对要立即应用的声明使用不同的存储机制。