Как определить, выполнил ли пользователь ранее вход в Google Firebase? - PullRequest
0 голосов
/ 26 апреля 2019

Я использую Google Signin для своего проекта Android, и после успешной аутентификации с помощью firebase auth я добавляю записи пользователей с дополнительными полями по умолчанию в firestore.

Проблема в том, что когда один и тот же пользователь пытается снова войти в систему с тем же адресом электронной почты, в базу данных firestore добавляется новый документ того же пользователя (два документа с одинаковыми данными)

Мне нужен способзнать, если пользователь уже выполнил вход, так что я не буду добавлять новый документ в firestore

Я искал переполнение стека и нашел только решение для аутентификации, используя электронную почту и пароль.Решение использует:

authResultTask.getException () instanceof FirebaseAuthUserCollisionException

, который не работает для входа в Google

//google signin result intent
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RequestSignInCode){

            GoogleSignInResult googleSignInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

            if (googleSignInResult.isSuccess()){

                Toast.makeText(WelcomeActivity.this,"Google Sign In result available ..."/* authCredential.getProvider()*/,
                        Toast.LENGTH_LONG).show();


                GoogleSignInAccount googleSignInAccount = googleSignInResult.getSignInAccount();

                firebaseUserAuth(googleSignInAccount);
            }
            //else Toast.makeText(this, "falsa1", Toast.LENGTH_SHORT).show();

        }
        //else Toast.makeText(this, "falsa2", Toast.LENGTH_SHORT).show();
    }

    public void firebaseUserAuth(final GoogleSignInAccount googleSignInAccount) {

            AuthCredential authCredential = GoogleAuthProvider.getCredential(googleSignInAccount.getIdToken(), null);

            mAuth.signInWithCredential(authCredential)
                    .addOnCompleteListener(WelcomeActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task AuthResultTask) {
                            Log.d("auth", "AuthResultTask:Complete ");

                                if (AuthResultTask.isSuccessful()) {
                                    Log.d("auth", "AuthResultTask successful");

                                    String email = googleSignInAccount.getEmail();

                                    Map<String, Object> userProperties = new HashMap<>();
                                    userProperties.put("email", email);
                                    userProperties.put("fullname", "");
                                    userProperties.put("isActivated", false);
                                    userProperties.put("has_rated", false);
                                    userProperties.put("product_key", "");
                                    userProperties.put("time_registered", new Date());
                                    userProperties.put("total_referral_count", 0);



                                    db.collection("users")
                                            .add(userProperties)
                                            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                                                @Override
                                                public void onSuccess(DocumentReference documentReference) {
                                                    progressBar.setVisibility(View.GONE);
                                                    Log.d("doc_id", documentReference.getId());
                                                    Toast.makeText(WelcomeActivity.this, "Google Sign In successful...",
                                                            Toast.LENGTH_LONG).show();

                                                    startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
                                                }
                                            })
                                            .addOnFailureListener(new OnFailureListener() {
                                                @Override
                                                public void onFailure(@NonNull Exception e) {
                                                    Log.w(DB_TAG, "Error adding document", e);
                                                    progressBar.setVisibility(View.GONE);
                                                }

                                            });


                                } else {
                                    Log.d("auth", "Exception: " + AuthResultTask.getException().toString());
                                    Toast.makeText(WelcomeActivity.this, "Something Went Wrong ...", Toast.LENGTH_LONG).show();
                                    progressBar.setVisibility(View.GONE);
                                }
                            }

                    });
        }

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Вам будет намного проще, если вы будете использовать UID пользователя, назначенный Firebase Authentication, в качестве идентификатора документа вместо использования случайного идентификатора, созданного методом add(). UID будет одинаковым при каждом входе пользователя в систему.

AuthResult authResult = ...
FirebaseUser user = authResult.getUser();
// this is unique for the user
String uid = user.getUid();

// Create a document for this user using their UID
db.collection("users").document(uid).set(userProperties);

Вы также можете сначала проверить, существует ли документ, прежде чем пытаться записать его таким образом, или использовать набор слияния для перезаписи существующего содержимого.

0 голосов
/ 26 апреля 2019

Насколько я понимаю, вы пытаетесь создать документ, когда пользователь впервые регистрируется.Поэтому вы должны отправить документ после того, как пользователь зарегистрируетсяНе после каждого входа.

...