firebase-android-sdk icon indicating copy to clipboard operation
firebase-android-sdk copied to clipboard

Firebase Auth signInWithCredentials Blocking Indefinitely/Not Failing

Open GEverding opened this issue 4 years ago • 14 comments

[READ] Step 1: Are you in the right place?

Issues filed here should be about bugs in the code in this repository. If you have a general question, need help debugging, or fall into some other category use one of these other channels:

  • For general technical questions, post a question on StackOverflow with the firebase tag.
  • For general Firebase discussion, use the firebase-talk google group.
  • For help troubleshooting your application that does not fall under one of the above categories, reach out to the personalized Firebase support channel.

[REQUIRED] Step 2: Describe your environment

  • Android Studio version: 4.1.1
  • Firebase Component: Authentication
  • Component version: com.google.firebase:firebase-bom:28.1.0

[REQUIRED] Step 3: Describe the problem

Steps to reproduce:

For 5000+ users per day signinWithCredential is never completing/erroring when using listeners. If I instead call Task.await with a 60 second timeout the TimeoutException is thrown. Since rewriting the login code hasn't changed the behaviour we need help debugging it.

If we tell them to install Cloudflare 1.1.1.1 they can log into the app. We then ask them to disable 1.1.1.1 and relogin and it works fine. Additionally at the same time we have other API requests so we don't believe the issue is network related.

We haven't figured out to reproduce it locally. Its effecting users across the globe with no patterns to OS version or phone. What I do observe is that it either completes instantly or not at all.

It feels like there is a bug getting hit inside the auth sdk that is preventing the Task from failing/completing. Are there any logs in the SDK or a way for us to debug this because its a real issue our users are facing.

Relevant Code:

Version 1

FirebaseAuth.getInstance().signInWithCredential(credential)
  .addOnCompleteListener(taskExecutor, new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
      if (task.isSuccessful()) {
        RaveLogging.i(LOG_TAG, "FirebaseAuth:signInWithCredential successful");
        handleFirebaseUser(FirebaseAuth.getInstance().getCurrentUser());
     } else {
       Logging.e(LOG_TAG, task.getException(), "FirebaseAuth:signInWithCredential failed");
       FirebaseCrashlytics.getInstance().recordException(task.getException());
       onLoginFailure(FIREBASE_AUTH_ERROR_CODE, getString(R.string.auth_failed));
     }
   }
});

Version 2

try {
  Tasks.await(FirebaseAuth.getInstance().signInWithCredential(credential), 60, TimeUnit.SECONDS);
  Logging.i(LOG_TAG, "FirebaseAuth:signInWithCredential successful");
  handleFirebaseUser(FirebaseAuth.getInstance().getCurrentUser());
  RaveLogging.i(LOG_TAG, "FirebaseAuth task succeeded: signInWithFirebase");
} catch (ExecutionException | InterruptedException | TimeoutException e) {
  RaveAnalytics.sendUniqueEvenAnalytics(new PlaybackInfo(), "nonfatal", "FIREBASE_AUTH_TIMEOUT", e.getMessage());
  ogging.e(LOG_TAG, e, "Await FirebaseAuth:signInWithCredential failed with exception: " + e.getMessage());
  FirebaseCrashlytics.getInstance().recordException(e);
  onLoginFailure(FIREBASE_AUTH_ERROR_CODE, getString(R.string.auth_failed));
   Logging.i(LOG_TAG, "GoogleAuthServer task failed: signInWithFirebase");
}

GEverding avatar Jun 25 '21 22:06 GEverding

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.

google-oss-bot avatar Jun 25 '21 22:06 google-oss-bot

Hi, thanks for filing this issue! We are unable to promise any timeline for this, but if others also have this issue, adding a +1 on this issue can help us prioritize adding this to the roadmap.

(Googler-only internal tracking bug: b/192411054)

yuchenshi avatar Jun 30 '21 02:06 yuchenshi

Exploring other Android SDK bugs and came across this issue where one of the comments is very similar to what we see.

GEverding avatar Jul 06 '21 17:07 GEverding

Thanks for linking, I checked with @malcolmdeck about this and we have been unable to reliably reproduce the linked issue. Unfortunately without a way to reproduce on our side we can't identify a fix

avolkovi avatar Jul 07 '21 18:07 avolkovi

Any updates? This issue is causing quite a problem for us, unfortunately.

j22purikas avatar Nov 21 '21 13:11 j22purikas

@GEverding, have you fixed your issues somehow?

j22purikas avatar Nov 30 '21 19:11 j22purikas

Is there any fix for the issue? Unfortunately still facing this in our app. But in our case, it happens while getting an id token.

val user = FirebaseAuth.getInstance().currentUser
Tasks.await(user.getIdToken(false), timeoutMillis, TimeUnit.MILLISECONDS)

LightWeek avatar Feb 18 '22 10:02 LightWeek

I have same issue. it happens while getting an id token. It use to API Authrization key, critical our app.

FirebaseAuth.getInstance().currentUser?.getIdToken(true)?.await()?.token

pistolcaffe avatar Aug 01 '22 04:08 pistolcaffe

I also face this indefinitely blocking state, and I was able to reproduce it by proxying my connection:

  • Share internet from my laptop to my mobile phone
  • Use Charles Proxy and slow down to the minimum my connection (1kbps up and down)
  • Set timeout to 10seconds
  • Launch my Firebase Auth PhoneAuthProvider.verifyPhoneNumber
  • And now you can wait forever, timeout is never triggered and you are stuck

So, what should we do? Why is timeout ignored?

YSDC avatar Dec 12 '22 14:12 YSDC

+1 this started recently after updating auth libraries both Firebase and login providers (Google and Facebook)

inteist avatar Apr 23 '23 06:04 inteist

@inteist What's the new version being used?

bhparijat avatar Apr 24 '23 06:04 bhparijat

I did a downgrade to 21.1 (?) (BoM 31.3.0) from BoM (31.5.0) since this was the last version where it was fine BUT it did not help. It's not the version.

I think I may have gotten to what the issue is (still unconfirmed as I just released an update)

Previous (WORKING code)

    fun getToken(completion: (String?) -> Unit) {
        val currentUser = FirebaseAuth.getInstance().currentUser

        val forceRefreshParam = false
        currentUser?.getIdToken(forceRefreshParam)
            ?.addOnSuccessListener {
                completion(it.token)
            }?.addOnFailureListener {
                Timber.e(it, "Can't get FirAuth token")
                completion(null)
            }
    }

new NON working code:

    suspend fun getIdToken(): String? {
        FirebaseAuth.getInstance().currentUser?.let { firebaseUser ->
            return firebaseUser.getIdToken(false).await().token
        } ?: run {
            Timber.e("Can't get FirAuth token")
            return null
        }
    }

I wanted an improved code without the callback but apparently this seems to create an issue.

Again, I am not sure this is the problem. I am rolling out a release where I rolled back that change.

Thanks.

inteist avatar Apr 24 '23 20:04 inteist

Hi @YSDC, could you please provide your charles proxy logs. It would be good to know what network requests are failing.

@inteist Do you have any logs for network requests?

bhparijat avatar May 02 '23 18:05 bhparijat