“additionalUserInfo.profile”中的自定义提供程序声明无法通过firebase admin获得?

“additionalUserInfo.profile”中的自定义提供程序声明无法通过firebase admin获得?,firebase,firebase-authentication,firebase-admin,Firebase,Firebase Authentication,Firebase Admin,我正在跟踪一个SAML身份提供者。成功登录后,重定向结果包含从提供程序派生的属性: provider=newfirebase.auth.SAMLAuthProvider('saml.testprovider'); firebase.auth().signInWithRedirect(提供程序); ... firebase.auth().getRedirectResult().then(函数(结果){ if(结果凭证){ console.log(result.additionalUserInfo.

我正在跟踪一个SAML身份提供者。成功登录后,重定向结果包含从提供程序派生的属性:

provider=newfirebase.auth.SAMLAuthProvider('saml.testprovider');
firebase.auth().signInWithRedirect(提供程序);
...
firebase.auth().getRedirectResult().then(函数(结果){
if(结果凭证){
console.log(result.additionalUserInfo.profile)//自定义提供程序声明,例如,{“provider foo”:“bar”}
}
} 
从文档中,同样的值也可以通过

  • result.user.getIdTokenResult().idTokenResult.claims.firebase.sign\u in\u属性

  • firebase.登录属性

这些相同的属性似乎不存储在firebase_admin SDK中可访问的任何位置:

来自firebase\u管理导入验证
user=auth.get\u用户(uid)
打印(user.custom_声明)#=>无…*提供程序*声明不在此处
print(user.provider_data[0])#=>有'federatedId'和其他一些,但仍然没有自定义提供程序声明
有没有办法在admin SDK中获取此信息?有没有办法知道它是否由Firebase保存?我是否需要在firestore中捕获它(这不是很危险,因为用户可能会伪造来自提供商的声明?)


谢谢!

附加SAML属性仅保留在令牌声明中,可通过以下方式访问:
result.user.getIdTokenResult().idTokenResult.claims.firebase.sign\u in\u属性

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

但是,您始终可以通过AdminSDK将所需的声明存储在记录中。 您将向服务器发送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令牌传递给服务器进行验证时访问它们。这是一种更好的方法,因为您不会遇到数据库与用户属性不同步的同步问题utes。

谢谢!在我的特殊情况下,管理员端点与一个完全不使用firebase的不同系统接口,我需要将这些声明提供给该系统。我将给您的令牌持久性示例一个旋转。