首页 文章

java.lang.IllegalArgumentException:必须指定idToken或accessToken

提问于
浏览
5

我正在尝试使用firebase实现Google登录身份验证 . 我正在关注this教程 .

错误日志:

java.lang.RuntimeException:将结果ResultInfo {who = null,request = 1002,result = -1,data = Intent {(has extras)}}传递给activity {com.clabs.codefosterapp / com.clabs.codefosterapp . SplashActivity}:java.lang.IllegalArgumentException:必须指定idToken或accessToken . 在android.app.ActivityThread.deliverResults(ActivityThread.java:3389)的android.app.ActivityThread.handleSendResult(ActivityThread.java:3432)android.app.ActivityThread.access $ 1300(ActivityThread.java:135)android.app .ActivityThread $ H.handleMessage(ActivityThread.java:1244)在android.app.Loper.loop(Looper.java:136)的android.app.Handler.dispatchMessage(Handler.java:102)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 $位于dalvik.system.NativeStart.main(本地方法)的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)中的MethodAndArgsCaller.run(ZygoteInit.java:779)引起:java.lang.IllegalArgumentException:必须指定idToken或accessToken . 来自com.google.firebase.auth.GoogleAuthCredential . (未知来源)位于com.clabs.codefosterapp.SplashActivity.firebaseAuthWithGoogle(SplashActivity.java:102)的com.google.firebase.auth.GoogleAuthProvider.getCredential(未知来源)位于android.app的Android.app.ActivityThread.deliverResults(ActivityThread.java:3385)的android.app.Activity.dispatchActivityResult(Activity.java:5423)上的.clabs.codefosterapp.SplashActivity.onActivityResult(SplashActivity.java:91) . ActivityThread.handleSendResult(ActivityThread.java:3432)在Android.app.Handler的android.app.ActivityThread.access $ 1300(ActivityThread.java:135)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1244) . 在android.app.Looper.loop(Looper.java:136)上的dispatchMessage(Handler.java:102)位于android.app.ActivityThread.main(ActivityThread.java:5045)的java.lang.reflect.Method.invokeNative(Native)方法)在java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(Zygo) teInit.java:779)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)at dalvik.system.NativeStart.main(Native Method)

崩溃在下面的行

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

我的代码:

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

2 回答

  • 23

    我正在审查我的整个代码,我发现在构建GoogleSignInOptions时我没有设置requestIdToken . 正确的代码是:

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

    您需要从Firebase中的应用信息中心获取网络客户端ID并将其粘贴到此处 .

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                   .requestIdToken("firebase_web_client_id_for_google")
                   .requestEmail()
                   .build();
    

相关问题