【问题标题】:Firebase custom claim how to set?Firebase 自定义声明如何设置?
【发布时间】:2019-07-02 19:05:18
【问题描述】:

我正在为 firebase 自定义声明而苦苦挣扎。

我已经测试了很多方法,但没有任何效果。显然,我错过了概念本身的一些重要内容。

所以我回到了根源。谷歌示例中的这个脚本应该对新创建的用户应用海关规则

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 可能有问题?)并部署了

【问题讨论】:

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


    【解决方案1】:

    这是一场比赛。如果函数先结束,你会得到更新的数据。

    getIdTokenResult 方法确实会强制刷新,但如果自定义声明还没有准备好,那就没有意义了。

    您需要设置另一个数据控制结构来触发客户端的强制刷新。例如,实时监听 rtd;

    root.child(`permissions/${uid}`).on..
    

    监听器内部的逻辑是:if the value for that node exists and is a number greater than some threshold, then trigger the user auth refresh

    在此期间,如果没有数据快照,用户界面可以反映加载状态;如果数据快照存在但权限级别较低,则用户界面可以反映非管理员视图。

    在 Functions 中,您必须在设置声明后设置节点:

    ..setCustomUserClaims(..).then(
        ref.setValue(9)
    );
    

    我在pastebin上有一个更详细的例子

    【讨论】:

      【解决方案2】:

      当客户端从服务器获取 ID 令牌时,会填充客户端上的声明。 ID 令牌有效期为一小时,之后 SDK 会自动刷新。

      在调用 Cloud Functions auth.user().onCreate 时,客户端已经获得了新用户的 ID 令牌。这意味着客户最多可能需要一个小时才能看到更新的声明。

      如果您希望客户在此之前获得自定义声明,您可以force it to refresh the token。但在this video 中,我们的安全专家建议(您考虑)对您希望立即应用的声明使用不同的存储机制。

      【讨论】:

      • 你知道的,我周末回来了,按了注销,重新登录,控制台里还是没有自定义的声明——console.log(idTokenResult.claims)
      • 嗯...我不知道为什么会这样,因为上述流程是自定义声明如何传递给客户端的。您可能需要仔细检查自定义声明是否真的从 Admin SDK 开始进入配置文件。但除此之外,还要查看我链接的视频,因为这可能是自定义声明不是您首选解决方案的用例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2019-12-17
      • 1970-01-01
      • 2020-06-28
      • 2021-12-31
      • 2021-06-16
      相关资源
      最近更新 更多