java.lang.IllegalArgumentException: Must specify an idToken or an accessToken

10,525

Solution 1

I was reviewing my entire code and I found that i didn't set the requestIdToken while building GoogleSignInOptions. The correct code is:

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

Solution 2

You need to get web client Id from your app dashboard in Firebase and paste it here.

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
               .requestIdToken("firebase_web_client_id_for_google")
               .requestEmail()
               .build();
Share:
10,525
Shunan
Author by

Shunan

.

Updated on June 15, 2022

Comments

  • Shunan
    Shunan about 2 years

    I am trying to implement google sign in authentication using firebase. I was following this tutorial.

    Error log :

    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1002, result=-1, data=Intent { (has extras) }} to activity {com.clabs.codefosterapp/com.clabs.codefosterapp.SplashActivity}: java.lang.IllegalArgumentException: Must specify an idToken or an accessToken.

    at android.app.ActivityThread.deliverResults(ActivityThread.java:3389) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3432) at android.app.ActivityThread.access$1300(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5045) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Must specify an idToken or an accessToken. at com.google.firebase.auth.GoogleAuthCredential.(Unknown Source) at com.google.firebase.auth.GoogleAuthProvider.getCredential(Unknown Source) at com.clabs.codefosterapp.SplashActivity.firebaseAuthWithGoogle(SplashActivity.java:102) at com.clabs.codefosterapp.SplashActivity.onActivityResult(SplashActivity.java:91) at android.app.Activity.dispatchActivityResult(Activity.java:5423) at android.app.ActivityThread.deliverResults(ActivityThread.java:3385) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3432)  at android.app.ActivityThread.access$1300(ActivityThread.java:135)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:136)  at android.app.ActivityThread.main(ActivityThread.java:5045)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)  at dalvik.system.NativeStart.main(Native Method)

    Crashing at following line

     AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    

    My code :

    private void googleSignIn() {
            Intent intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(intent, SIGN_IN);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                if (result.isSuccess()) {
                    GoogleSignInAccount account = result.getSignInAccount();
                    firebaseAuthWithGoogle(account);
                } else {
    
                    Toast.makeText(SplashActivity.this, "Oops! Something Went Wrong", Toast.LENGTH_SHORT).show();
                }
    
            }
        }
    private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
    
            AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (!task.isSuccessful()) {
                                Toast.makeText(SplashActivity.this, "Authentication Failed", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
        }
    
  • Максим Петлюк
    Максим Петлюк almost 7 years
    Here is description where you can find web_client_id stackoverflow.com/questions/34283355/…
  • Sam Chen
    Sam Chen about 4 years
    Yes, we need to pass the web client id to the requestIdToken(), and the web client id can be found in the Firebase console -> Authentication -> Sign-in method -> Google -> Web Client ID configuration
  • ArdenDev
    ArdenDev over 3 years
    Although we build Android apps, we still need to pass this in to make it work.