无法通过firebase管理员获得“ additionalUserInfo.profile”中的自定义提供商声明?

时间:2019-09-28 00:26:32

标签: firebase firebase-authentication firebase-admin

我正在关注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中捕获它吗(因为用户可以伪造来自提供者的声明,这没有风险吗?)

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

但是,您始终可以通过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令牌传递到服务器进行验证时访问它们。这是一种更好的方法,因为您不会遇到同步问题,即数据库与用户属性不同步。