如何检查用户是不是刚刚在 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的主要内容,如果未能解决你的问题,请参考以下文章