Регистрация пользователя в Firebase через Google - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь реализовать функцию входа в Google в своем приложении.Я следовал этой документации , проблема в том, что если я использую ранее использовавшуюся учетную запись 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();
                        }

                    }
                }
            });
}

Что не так с моим кодом, пожалуйста, объясните.

1 Ответ

0 голосов
/ 12 ноября 2018

Когда вы вызываете signInWithCredential, SDK возвращает задачу, которая успешно завершается, когда пользователь вошел в систему. Поскольку вы вызываете storeUserCredentials при этом условии, он будет вызываться каждый раз, когда пользователь входит в систему. Это на самом делевполне нормальный поток.

Если вы хотите определить, является ли эта учетная запись новой для Firebase Authentication, вы можете проверить время создания пользователя.См. Firebase Auth, как узнать, что новый пользователь зарегистрировался, а не существующий пользователь?

Если вы хотите определить, видели ли вы этого пользователя раньше, вам нужнопроверить в базе данных перед звонком storeUserCredentials.Но теперь у вас есть довольно идиоматический поток, поскольку он, например, гарантирует, что вы сохраняете актуальное отображаемое имя каждый раз, когда просите пользователя войти в систему.

...