Check if user is authenticated for the first time in Firebase Google Authentication in Android

后端 未结 8 1412
一向
一向 2020-11-30 06:16

I am using Firebase Authentication in an Android application, and I am using Google account authentication as an option to sign in to the application.

How can I know

相关标签:
8条回答
  • 2020-11-30 06:46

    From the Firebase-ui docs, you can check the last sign-in timestamp against the created-at timestamp like this:

    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.
    }
    
    0 讨论(0)
  • 2020-11-30 06:46

    A solution when you use Firebase Auth together with Firestore

    The root architecture of the Firestore Database would look like this

    Use the Firebase Auth currentUser.uid to create a root document for each user. Start by adding a field called registered_at to the root document as soon as the user is created the first time and then add your specific collections to your root document depending on your use case.

    When logging in or signing in you can then check if the document with the registered_at field already exists. If it doesn't exist yet, then you can treat the user as a new user (assuming the user can not delete or alter the registered_at field later)

    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")
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 06:47

    To check if it's the first time user logs in, simply call the AdditionalUserInfo.isNewUser() method in the OnCompleteListener.onComplete callback.

    Example code below, be sure to check for 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"));
                }
            }
        };
    

    Check the docs for more reference AdditionalUserInfo

    0 讨论(0)
  • 2020-11-30 06:47

    While I fully agree that the most correct way (given the inability to add new fields to the auth user table) is to create a new path for users and store info there, I didn't want to make an additional request after logging in to do this check (I'm using Firestore and requests = money).

    I needed to do this first login check to prompt for a userName (as display name is pulled from Facebook/Google and I wanted to give the option of overriding if it's their first login). What I ended up doing was using the photoURL property as a flag to determine if it was their first time or not. It's not ideal but maybe someone that wants to save on requests can use this as a workaround. It's not as big a deal for Firebase but for Firestore it's more costly for your plan

    0 讨论(0)
  • 2020-11-30 06:54

    According to the new version of Firebase auth (16.0.1) The AuthResult class has a member function which results true or false (is the user is new). Assuming "credential" is defined in the scope(it is the google credential ). An example is shown below: `

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

    Thanks to firebase:)

    0 讨论(0)
  • 2020-11-30 07:02

    From version 11.6.0 we can use AdditionalUserInfo.isNewUser()

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

    0 讨论(0)
提交回复
热议问题