【问题标题】:Custom provider claims in `additionalUserInfo.profile` are not available via firebase admin?`additionalUserInfo.profile` 中的自定义提供程序声明不能通过 firebase 管理员获得?
【发布时间】:2019-09-28 00:26:32
【问题描述】:

我正在关注 firebase/identity toolkit docs 以获取 SAML 身份提供者。成功登录后,重定向结果包含从提供者派生的属性:

provider = new firebase.auth.SAMLAuthProvider('saml.test-provider');
firebase.auth().signInWithRedirect(provider);

...

firebase.auth().getRedirectResult().then(function(result) {
  if (result.credential) {
    console.log(result.additionalUserInfo.profile)  // Custom provider claims, e.g., {"provider-foo":"bar"}
  }
} 

从文档中,同样的值也可以通过

获得
  • result.user.getIdTokenResult().idTokenResult.claims.firebase.sign_in_attributes

  • firebase.sign_in_attributes

这些相同的属性似乎没有存储在 firebase_admin SDK 中可访问的任何地方:

from firebase_admin import auth
user = auth.get_user(uid)
print(user.custom_claims) # => None ... *provider* claims aren't here
print(user.provider_data[0]) # => has `federatedId` and some others, but still no custom provider claims

有没有办法在管理 SDK 中获取此信息?有什么方法可以判断它是否被 Firebase 保存?我是否需要在 Firestore 中捕获它(这不会有风险,因为用户可以伪造来自提供商的声明吗?)

谢谢!

【问题讨论】:

    标签: firebase firebase-authentication firebase-admin


    【解决方案1】:

    额外的 SAML 属性仅保留在可通过以下方式访问的令牌声明中: result.user.getIdTokenResult().idTokenResult.claims.firebase.sign_in_attributes

    它们不存储在用户记录中。出于隐私原因,Identity Platform/Firebase 身份验证不会在存储中保留其他用户信息。

    但是,您始终可以通过 Admin SDK 将所需的声明存储在记录中。 您将 ID 令牌发送到您的服务器,对其进行验证,解析您需要的声明并将它们设置在用户记录中。

    这是通过 Node.js Admin SDK 提供的示例。

    app.post('/saveUserClaims', (req, res) => {
      // Get the ID token passed.
      const idToken = req.body.idToken;
      admin.auth().verifyIdToken(idToken)
        .then(function(decodedToken) {
          const uid = decodedToken.uid;
          // ...
          const samlClaims = decodedToken.firebase.sign_in_attributes;
          // You would filter the claims as there could be too many.
          // You can also save these claims in your database, etc.
          return admin.auth().setCustomUserClaims(uid, samlClaims)
            .then(() => {
              res.status(200).end();
            });
        }).catch(function(error) {
         // Handle error
       });
    });
    

    也就是说,通常无需保存这些声明,因为它们始终在 ID 令牌中可用,您可以通过安全规则访问它们,或者在将 ID 令牌传递给服务器进行验证时访问它们。这是一种更好的方法,因为您不会遇到数据库与用户属性不同步的同步问题。

    【讨论】:

    • 谢谢!在我的特定情况下,管理端点正在与一个完全不使用 firebase 的不同系统连接,我需要将这些声明提供回该系统。我将试一试您的令牌持久性示例。
    猜你喜欢
    • 2020-08-07
    • 2018-11-14
    • 2021-01-24
    • 2020-06-29
    • 1970-01-01
    • 2011-11-27
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多