从 Firebase 身份验证控制台获取标识符字段

Get Identifier field from Firebase Auth Console

我正在尝试从当前使用 Facebook Firebase 提供商进行身份验证的用户处获取电子邮件。该电子邮件列在项目的 Firebase 身份验证控制台内的 Identifier 字段下:

然而,当我调用 firebase.auth().currentUser 时,用户信息加载,但是电子邮件字段是 null。关于如何从 Firebase 获取标识符(这是我看到电子邮件地址的地方)的任何想法?这甚至可能吗?

下面是我使用的代码:

    componentDidMount() {

      let user = firebase.auth().currentUser;
      let name, email, photoUrl, uid, emailVerified;

      if (user !== null) {
       name = user.displayName;
       email = user.email;
       photoUrl = user.photoURL;
       emailVerified = user.emailVerified;
       uid = user.uid;

       console.log(name, email, photoUrl, emailVerified, uid);
      }

    }

注意:在 Firebase 中启用了防止创建具有相同电子邮件地址的多个帐户。此外,Facebook API 权限设置为 ['public_profile', 'email']

经过一些测试和调试后,我发现如果您使用常规的 Firebase Email/Password 登录方法,email 字段将被填充。但是,如果您使用其他登录提供程序方法(例如 Facebook),电子邮件字段将显示 null(不确定为什么)。

user 对象的进一步检查发现 providerData 属性。 这是一个包含所有提供商信息(包括电子邮件地址)的数组:

所以,我更新了我的代码以适应这个:

    componentDidMount() {

      let user = firebase.auth().currentUser;

      let name, email, photoUrl, uid, emailVerified;

      if (user) {
        name = user.displayName; 
        email = user.email;
        photoUrl = user.photoURL; 
        emailVerified = user.emailVerified;
        uid = user.uid;

        if (!email) {
          email = user.providerData[0].email;
        }

        console.log(name, email, photoUrl, emailVerified, uid);
      }

    }

在我的例子中,getEmail() 方法始终 returns 三种登录可能性的数据(如果用户授权我的应用程序使用 show/use 电子邮件):使用电子邮件登录、登录使用 Google 登录,使用 Facebook 登录。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
Log.v(TAG,"user.getEmail():"+user.getEmail());

if (user.getEmail() == null){
    // User did not authorize the app to show/user email
}
else {
   Log.v(TAG,"user.getEmail():"+user.getEmail());   
}