it-swarm.com.de

Prüfen Sie, ob der Benutzer zum ersten Mal in der Firebase-Google-Authentifizierung in Android authentifiziert wurde

Ich verwende die Firebase-Authentifizierung in einer Android-Anwendung und benutze die Google-Kontoauthentifizierung als Option zur Anmeldung bei der Anwendung.

Wie kann ich wissen, ob der Benutzer zum ersten Mal bei der Anwendung angemeldet ist oder nicht?

25
rainman

Um zu überprüfen, ob sich der Benutzer zum ersten Mal anmeldet, rufen Sie einfach die AdditionalUserInfo.isNewUser()-Methode im OnCompleteListener.onComplete-Callback auf.

Beispielcode unten, stellen Sie sicher, dass Sie auf null überprüfen.

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

Überprüfen Sie die Dokumente auf weitere Referenz AdditionalUserInfo

20
EricT

Gemäß der neuen Version von Firebase auth (16.0.1) Die AuthResult-Klasse hat eine Memberfunktion, die true oder false ergibt (ist der Benutzer neu). Angenommen, "Credential" ist im Geltungsbereich definiert (es ist der Google-Berechtigungsnachweis) . Ein Beispiel ist unten gezeigt: `

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

                    }


            });

Danke an die Firebase :)  

4
Ananthu

In den Firebase-ui-Dokumenten können Sie den Zeitstempel der letzten Anmeldung mit dem Zeitstempel der erstellten Uhrzeit vergleichen:

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

Ab Version 11.6.0 können wir AdditionalUserInfo.isNewUser() verwenden. 

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

2
Sahdeep Singh

Eine Lösung, wenn Sie Firebase Auth zusammen mit Firestore verwenden

Die Wurzelarchitektur der Firestore-Datenbank würde folgendermaßen aussehen  enter image description here

Verwenden Sie Firebase Auth currentUser.uid, um für jeden Benutzer ein Stammdokument zu erstellen. Beginnen Sie mit dem Hinzufügen eines Felds mit dem Namen registered_at zum Stammdokument, sobald der Benutzer das erste Mal erstellt wird, und fügen Sie Ihrem Stammdokument dann je nach Anwendungsfall Ihre spezifischen Sammlungen hinzu.

Beim Anmelden oder Anmelden können Sie dann prüfen, ob das Dokument mit dem Feld registered_at bereits vorhanden ist. Wenn es noch nicht existiert, können Sie den Benutzer als neuen Benutzer behandeln (vorausgesetzt, der Benutzer kann das Feld registered_at später nicht löschen oder ändern.)

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

Ich stimme voll und ganz darin überein, dass der korrekte Weg (da es nicht möglich ist, der auth-Benutzertabelle neue Felder hinzuzufügen) darin besteht, einen neuen Pfad für Benutzer zu erstellen und Informationen dort zu speichern, jedoch wollte ich nach der Anmeldung keine zusätzliche Anfrage stellen Überprüfen Sie dies (ich verwende Firestore und bittet um Geld).

Ich musste diesen ersten Login-Check bei Prompt nach einem Benutzernamen durchführen (da der Anzeigename von Facebook/Google abgerufen wird, und ich wollte die Option zum Überschreiben angeben, wenn es das erste Login ist). Am Ende habe ich die Eigenschaft photoURL als Flag verwendet, um festzustellen, ob es das erste Mal war oder nicht. Es ist nicht ideal, aber vielleicht kann jemand, der Anfragen sparen möchte, dies als Workaround verwenden. Für Firebase ist dies kein so großer Deal, aber für Firestore ist es teurer für Ihren Plan

0
JamesR