如何在Firebase中检查用户是否已通过身份验证?

时间:2018-07-20 13:23:24

标签: android firebase firebase-authentication google-signin

我的应用程序中有几种注册方法,如下所示:

enter image description here

让我们围绕 Google登录方法解决问题:
我正在做的是,当用户登录enteringDataIntoUserNode()方法时,会在signInWithCredential()方法内部调用,例如:

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    AuthCredential credential = 
           GoogleAuthProvider.getCredential(acct.getIdToken(), null);

    //  signing in
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {

                        //  entering default values in the database
                        enteringDataIntoUserNode();

                        Intent intent = new Intent(LoginAndSignupActivity.this, MainActivity.class);
                        startActivity(intent);
                        finish();
                    }
                    else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                    }

                }
            });
}

enteringDataIntoUserNode()

private void enteringDataIntoUserNode() {
    final String currentUid = mAuth.getCurrentUser().getUid();

    //
    String deviceToken = FirebaseInstanceId.getInstance().getToken();
    final String userName = mAuth.getCurrentUser().getDisplayName();
    String imageUrl = mAuth.getCurrentUser().getPhotoUrl().toString();
    String userStatus = "Hi there! How is it going?";

    //  inserting data in key-value pair
    usersReference.child(currentUid).child("user_name").setValue(userName);
    usersReference.child(currentUid).child("user_status").setValue(userStatus);
    usersReference.child(currentUid).child("user_image").setValue(imageUrl);
    usersReference.child(currentUid).child("device_token").setValue(deviceToken);

    //  when this last value will be inserted then, making an intent to MainActivity
    usersReference.child(currentUid).child("user_thumb_image").setValue(imageUrl)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        Log.d(TAG, "onComplete: Data insertion for the new user is successful ");
                    }
                }
            });
}

enteringDataIntoUserNode()方法只是在每次用户登录时将一些默认数据传递到数据库。但是,如果用户更改了其详细信息(例如图像或用户名等)并退出并再次登录通过 Google登录方法,然后再次调用 enteringDataIntoUserNode()方法,并且默认用户名将覆盖用户详细信息。

我的问题是,有什么方法可以检查用户是否在 Google登录期间是第一次登录,这样在后一种情况下,我可以跳过呼叫 enterDataIntoUserNode()方法,并防止数据被覆盖。 在 Facebook 电话号码登录期间,我也想实现相同的目的。

2 个答案:

答案 0 :(得分:1)

如果您检查用户是否为首次登录,则要检查用户是否为新用户也是如此。因此,要解决此问题,我们可以像这样在isNewUser()回调中简单地调用OnCompleteListener.onComplete方法:

OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (task.isSuccessful()) {
            boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
            if (isNewUser) {
                Log.d("TAG", "The user is new!");
            } else {
                Log.d("TAG", "The user is not new!");
            }
        }
    }
};

有关更多信息,请参见official documentation

答案 1 :(得分:0)

您可以使用以下方法检查帐户的创建时间:

task.getResult().getUser().getMetadata().getCreationTimestamp()

请参见reference docs

但是一种常见的方法也是检查用户是否已经存在于数据库using a transaction中。