web-dev-qa-db-fra.com

Vérifier si l'utilisateur est authentifié pour la première fois dans Firebase. Authentification Google sous Android

J'utilise l'authentification Firebase dans une application Android et j'utilise l'authentification de compte Google comme option pour vous connecter à l'application.

Comment savoir si l'utilisateur est connecté à l'application pour la première fois ou non?

25
rainman

Pour vérifier s'il s'agit de la première connexion de l'utilisateur, appelez simplement la méthode AdditionalUserInfo.isNewUser() dans le rappel OnCompleteListener.onComplete.

Exemple de code ci-dessous, assurez-vous de vérifier la valeur null.

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"));
            }
        }
    };

Vérifiez la documentation pour plus de références AdditionalUserInfo

20
EricT

Selon la nouvelle version de Firebase auth (16.0.1) La classe AuthResult a une fonction membre qui donne la valeur true ou false (l’utilisateur est nouveau). En supposant que "informations d'identification" est défini dans la portée (il s'agit des informations d'identification google) . Un exemple est présenté ci-dessous: `

     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();

                    }


            });

Merci à firebase :)  

4
Ananthu

A partir de Firebase-ui docs , vous pouvez comparer le dernier horodatage de connexion à l'horodatage créé à l'heure, comme suit:

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.
}
4
kip2

A partir de la version 11.6.0, nous pouvons utiliser AdditionalUserInfo.isNewUser() 

https://firebase.google.com/docs/reference/Android/com/google/firebase/auth/AdditionalUserInfo

2
Sahdeep Singh

Une solution lorsque vous utilisez Firebase Auth avec Firestore

L’architecture racine de la base de données Firestore ressemblerait à ceci: __.  enter image description here

Utilisez Firebase Auth currentUser.uid pour créer un document racine pour chaque utilisateur. Commencez par ajouter un champ appelé registered_at au document racine dès que l'utilisateur est créé pour la première fois, puis ajoutez vos collections spécifiques à votre document racine en fonction de votre cas d'utilisation.

Lors de la connexion ou de la connexion, vous pouvez alors vérifier si le document avec le champ registered_at existe déjà. S'il n'existe pas encore, vous pouvez traiter l'utilisateur comme un nouvel utilisateur (en supposant que l'utilisateur ne puisse pas supprimer ou modifier le champ registered_at ultérieurement).

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")
        }
    }
}
1
IHeartAndroid
0
aditya shrivastava

Bien que je sois tout à fait d’accord pour dire que le moyen le plus correct (compte tenu de l’impossibilité d’ajouter de nouveaux champs à la table des utilisateurs autorisés) est de créer un nouveau chemin pour les utilisateurs et de stocker les informations, faire cette vérification (j'utilise Firestore et demande = argent).

J'avais besoin de faire cette première vérification de connexion à Demander un nom d'utilisateur (comme le nom d'affichage est tiré de Facebook/Google et je voulais donner l'option de remplacer si c'est leur première connexion). J'ai fini par utiliser la propriété photoURL comme indicateur pour déterminer si c'était la première fois ou non. Ce n'est pas idéal, mais peut-être que quelqu'un qui souhaite économiser sur les demandes peut utiliser cette solution de contournement. Ce n'est pas un si gros problème pour Firebase, mais pour Firestore, c'est plus coûteux pour votre plan.

0
JamesR