Проверьте, прошла ли аутентификация пользователя впервые в Firebase Google Authentication в Android

Я использую Аутентификацию Firebase в приложении Android, и я использую аутентификацию аккаунта Google в качестве опции для входа в приложение.

Как я могу узнать, вошел ли пользователь в приложение в первый раз или нет?

Ответ 1

Чтобы проверить, входит ли пользователь в первый раз, просто вызовите метод AdditionalUserInfo.isNewUser() в OnCompleteListener.onComplete.

Пример кода ниже, обязательно проверьте на нулевое значение.

OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
                boolean isNew = task.getResult().getAdditionalUserInfo().isNewUser();
                Log.d("MyTAG", "onComplete: " + (isNew ? "new user" : "old user"));
            }
        }
    };

Проверьте документы для получения AdditionalUserInfo ссылки AdditionalUserInfo

Ответ 2

В документации Firebase-ui вы можете проверить последнюю временную метку входа по временной метке, созданной при:

FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
    // The user is new, show them a fancy intro screen!
} else {
    // This is an existing user, show them a welcome back screen.
}

Ответ 3

В соответствии с новой версией Firebase auth (16.0.1) класс AuthResult имеет функцию-член, которая возвращает true или false (если пользователь новый). Предполагая, что в области определены "учетные данные" (это учетные данные Google). Пример показан ниже: '

private FirebaseAuth mAuth;

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

mAuth = FirebaseAuth.getInstance();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount acct = task.getResult(ApiException.class);
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()) {
                        Log.d(TAG, "linkWithCredential:success");


                        boolean newuser = task.getResult().getAdditionalUserInfo().isNewUser();



                        if(newuser){

                             //Do Stuffs for new user

                         }else{

                            //Continue with Sign up 
                        }

                    } else {

                        Toast.makeText(MyClass.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();

                    }


            });

Благодаря Firebase :)

Ответ 5

Решение, когда вы используете Firebase Auth вместе с Firestore

Корневая архитектура базы данных Firestore будет выглядеть так: введите описание изображения здесь

Используйте Firebase Auth currentUser.uid для создания корневого документа для каждого пользователя. Начните с добавления поля под названием registered_at в корневой документ, как только пользователь будет создан в первый раз, а затем добавит ваши конкретные коллекции в ваш корневой документ в зависимости от вашего варианта использования.

При входе или входе в систему вы можете проверить, существует ли документ с полем registered_at. Если он еще не существует, вы можете обращаться с пользователем как новым пользователем (при условии, что пользователь не может удалить или изменить поле registered_at позже)

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentReference
import com.google.firebase.firestore.FirebaseFirestore

fun rootDocument(): DocumentReference? = rootPath()?.let {
    return fireStore().document(it)
}

fun rootPath(): String? {
    val loggedInUser = loggedInUser()
    if (loggedInUser != null) {
        return "users/${loggedInUser.uid}"
    }
    return null
}

fun fireStore() = FirebaseFirestore.getInstance()

fun createWriteBatch() = fireStore().batch()

fun loggedInUser() = fireAuth().currentUser

fun fireAuth(): FirebaseAuth = FirebaseAuth.getInstance()

fun afterSignIn() {

    val rootDocument = rootDocument()
            ?: throw IllegalStateException("root document not found")

    rootDocument.get().addOnCompleteListener {
        val isNewUser = it.result.exists().not()

        if (isNewUser) {
            val batch = createWriteBatch()

            batch.set(rootDocument, HashMap<Any, Any>().apply {
                put("registered_at", System.currentTimeMillis())
            })

            batch.commit().addOnCompleteListener {
                println("this is a new user")
            }

        } else {
            println("this is not a new user")
        }
    }
}

Ответ 7

Хотя я полностью согласен с тем, что наиболее правильный способ (учитывая невозможность добавления новых полей в таблицу пользователя auth) заключается в создании нового пути для пользователей и хранении информации там, я не хотел делать дополнительный запрос после войдите в систему, чтобы сделать эту проверку (я использую Firestore и запросы = деньги).

Мне нужно было выполнить эту первую проверку входа, чтобы вызвать имя пользователя (поскольку отображаемое имя вытаскивается из Facebook/Google, и я хотел бы дать возможность переопределить, если это их первый логин). В результате я использовал свойство photoURL в качестве флага, чтобы определить, был ли это их первый раз или нет. Это не идеально, но, возможно, кто-то, кто хочет сэкономить на запросах, может использовать это как обходной путь. Это не такая большая сделка для Firebase, но для Firestore это более дорогостоящее для вашего плана.

Ответ 8

Когда пользователь впервые регистрируется в пароле reset. Вы можете отправить пароль reset электронной почты пользователю с помощью метода sendPasswordResetEmail. ссылка: https://firebase.google.com/docs/auth/android/manage-users

тогда пользователь получит параметр reset password и сменит пароль и логин с новыми учетными данными, и если пользователь выдаст неправильный идентификатор почты, то он не сможет войти в систему.