如何检查用户是不是刚刚在 Firebase 中首次登录 Google

Posted

技术标签:

【中文标题】如何检查用户是不是刚刚在 Firebase 中首次登录 Google【英文标题】:How to check if a user just Google signed-in for the first time in Firebase如何检查用户是否刚刚在 Firebase 中首次登录 Google 【发布时间】:2018-01-25 11:39:45 【问题描述】:

我有一个已使用 Firebase 进行电子邮件和密码身份验证的 android 应用。为了方便用户,我现在也在项目中添加了 Google 登录。 问题是,当我使用电子邮件登录时,该应用程序会根据用户的 UID(唯一用户 ID - 由 Firebase Auth 获取)在密钥下的实时数据库上创建一些数据。该数据通常在用户注册时创建。但是,当用户使用 Google 登录功能时,他们会通过 google play 服务托管的另一个活动进行身份验证。我无法添加此数据。因此,问题出现了,我现在应该做什么来检查用户是否使用 Google 帐户登录。另外,如果用户是第一次进行谷歌登录,它将在实时数据库中创建新数据,否则它将检索数据。 请帮助我,因为我被困住了。

【问题讨论】:

【参考方案1】:

javascript 中,以下方法 firebase.auth().signInWithCredential 返回 firebase.auth.UserCredential,它有一个属性 additionalUserInfo

additionalUserInfo 有一个名为 isNewUser 的布尔属性。

您可以在isNewUser 上进行简单检查,以检查用户是否是第一次登录。

【讨论】:

【参考方案2】:

试试,additionalUserInfo.isNewUser:

 var provider = new firebase.auth.GoogleAuthProvider();
      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => 
          console.log(result.additionalUserInfo.isNewUser)
        )

【讨论】:

【参考方案3】:

耶!如果数据已经存在于数据库中,我找到了一种可行的方法。它按我的意图工作, 如果我从谷歌/电子邮件创建一个新用户,我会将他们的姓名保存在实时数据库中,但从同一个帐户登录,早些时候会导致在同一个地方重写新数据(姓名) - 数据带宽使用过多。 我解决了这个问题。它只是检查那里是否存在数据,然后继续前进。

final User newUser = new User();
    newUser.email = user.getEmail();
    newUser.name = user.getDisplayName();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            if (dataSnapshot.hasChild("user/" + user.getUid())) 
                //User Exists , No Need To add new data.
                //Get previous data from firebase. Take previous data as soon as possible..
                return;
             else 
                FirebaseDatabase.getInstance().getReference().child("user/" + user.getUid()).setValue(newUser);
            
        

        @Override
        public void onCancelled(DatabaseError databaseError) 

        
    );

我有件事要告诉你们,User 是一个带有 POJO 的自定义类,用于将数据放入 firebase 数据库。 如果这也适合你,请回复我。

编辑 - Firestore

    newUser.email = user.getEmail();
    newUser.name = user.getDisplayName();
    DocumentReference docRef = 
    db.collection("users").document(user.getUid());
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() 
    @Override
    public void onComplete(@NonNull 
   Task<DocumentSnapshot> task) 
        if (task.isSuccessful()) 
            DocumentSnapshot document = task.getResult();
            if (document.exists()) 
                Log.d(TAG, "DocumentSnapshot data: " + document.getData());
    //User Exists , No Need To add new data.
                    //Get previous data from firebase. Take previous data as soon as possible..
             else 
                Log.d(TAG, "No such document");
   //Set new data here
            
         else 
            Log.d(TAG, "get failed with ", task.getException());
        
    
    );```

【讨论】:

如何在新的 Firestore 而不是 RealtimeDatabase 上尝试相同的逻辑 我已经编辑了我的答案。我希望 Firestore 代码 sn-p 对您有所帮助.. 我有同样的问题。我只使用谷歌登录方法。如何在 Firebase 身份验证页面中查看已签名用户?我只想控制用户登录身份验证。谷歌登录的用户不会出现在 Firebase 中! @Handelika 你能详细说明一下吗。我会帮忙的。 @AnujKumar,谢谢。我找到了mAuth.signInWithCredential(credential) 的解决方案【参考方案4】:

您需要保存共享偏好并检查用户是否是第一次登录。

这个link 可以帮助你。 但在查看代码之前,请阅读FIREBASE 的文档。

【讨论】:

如果重新安装应用程序或在其他设备上,这将为同一用户创建一对新密钥 正如我之前所说的,我没有这样尝试过。我引用了一个位置,在根据 UID 获取实例后保存数据的位置。但这不起作用。你能根据我的评论帮我解决这个问题吗【参考方案5】:

第一次登录时在数据库中添加某种标志并使其成为真的。每当用户登录时,检查该标志是否存在且为真,然后检索旧数据,否则添加新数据(或任何您想要的)。

firstlogin: true

这是带有 facebook 登录的 javascript 代码,你可能有一个想法。

  var provider = new firebase.auth.FacebookAuthProvider();
  function facebookSignin() 
    firebase.auth().signInWithPopup(provider)
     .then(function(result) 
        var user = result.user;
        firebase.database().ref('/users/'+user.uid).on('value', 
          function(snapshot)
             if (!snapshot.exists()) 
                 //user does not exist, add new data
             else
                 //user exist, retrieve old data
            
       ); //firebase.database().ref ends
     );//then() ends
   //function ends

【讨论】:

我没有这样尝试过。我引用了一个位置,在根据 UID 获取实例后保存数据的位置。但这不起作用。你能根据我的评论帮我解决这个问题吗 我知道 Firebase Android 中的值事件监听器。你能根据 Java 简要解释一下上面的代码片段吗? 当用户使用 Google 成功登录应用时,代码转到 updateUI() 方法 在数据库signinflags中创建一个节点——让用户先登录——然后获取最近登录的用户ID——然后检查signinflags节点是否存在用户—— -- 如果是,则检索旧数据 ---- 如果否,则将此用户 ID 推送到 signinflags 节点。简单

以上是关于如何检查用户是不是刚刚在 Firebase 中首次登录 Google的主要内容,如果未能解决你的问题,请参考以下文章

如何在不请求的情况下在firebase-auth中首次加载时获取currentUser

在 appDelegate 中首次展示视图

查询 Firebase 用户以检查数据库中是不是存在联系人

允许用户在 Firestore 规则中首次尝试写入

小程序中首次获取位置权限失败后,主动引导用户授权方案

如何检查用户是不是存在于 Firebase 中?