首页 > 解决方案 > 使用 Google 注册 Firebase 用户

问题描述

我正在尝试在我的应用中实现谷歌登录功能。我已遵循此文档,问题是 - 如果我使用以前使用的 google 帐户,它不会显示诸如“电子邮件已在此应用程序中注册”之类的错误。结果,该帐户之前存储的数据将被删除,并重新注册 google 帐户。这是我的代码:

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        int coins = 100;
                        String name, email;
                        name = user.getDisplayName();
                        email = user.getEmail();
                        //updateUI(user);
                        storeUserCredentials(name, email, coins);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(SignUpActivity.this, "Error : " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

public void storeUserCredentials(String name, String email, int coins){
    progressBar.setVisibility(View.VISIBLE);
    User user = new User(name, email, coins);

    mDatabase.getReference("Users")
            .child(mAuth.getCurrentUser().getUid())
            .setValue(user)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    progressBar.setVisibility(View.GONE);
                    if (task.isSuccessful()){
                        Toast.makeText(SignUpActivity.this, "Registration Successful!", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(SignUpActivity.this, MainActivity.class));
                        finish();
                    } else {
                        if (task.getException() instanceof FirebaseAuthUserCollisionException){
                            Toast.makeText(SignUpActivity.this, "The email is already used", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(SignUpActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }

                    }
                }
            });
}

我的代码有什么问题,请解释一下。

标签: javaandroidfirebasefirebase-authenticationgoogle-signin

解决方案


当你调用signInWithCredentialSDK时返回一个用户登录成功完成的任务。由于你storeUserCredentials在那个条件下调用,所以每次用户登录时都会调用它。这实际上是一个很正常的流程。

如果要检测此帐户是否是 Firebase 身份验证的新帐户,可以检查用户的创建时间。请参阅Firebase 身份验证,如何知道新用户已注册,而不是现有用户登录?

如果你想检测你之前是否已经见过这个用户,你需要在调用之前检查数据库storeUserCredentials。但是您现在拥有的是一个非常惯用的流程,例如,它可以确保您在每次要求用户登录时存储最新的显示名称。


推荐阅读