Firebase自定义声明如何设置?

时间:2019-02-08 14:05:12

标签: javascript firebase-authentication google-cloud-functions

我正在努力解决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可能有问题吗?)并已部署

2 个答案:

答案 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中,我们的安全专家建议(您考虑)对要立即应用的声明使用不同的存储机制。