GoogleSignInAccount getIdToken()为null

时间:2017-04-03 07:57:23

标签: android firebase firebase-authentication google-login

嘿我正在使用 Firebase 身份验证并启用 Google登录功能。 谷歌登录运行良好,我获得了所有信息。但是,当我想将用户保存在Firebase用户列表中时,getIdToken()为空:

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {       

    //here the acct.getIdToken() is null

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential)
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
          @Override
          public void onComplete(@NonNull Task<AuthResult> task) {
              if (!task.isSuccessful()) {
                  Toast.makeText(SignIn.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
              }

              // [START_EXCLUDE]
              progressDialog.hide();
              // [END_EXCLUDE]
          }
      });

}

6 个答案:

答案 0 :(得分:6)

您可能忘记在GoogleSignInOptions对象

上使用requestIdToken()了

试一试:

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

答案 1 :(得分:4)

您的Google OAuth客户端凭据应该适用于Web应用程序,而非Android。您的Google登录选项应该类似于下面的代码(它是C#,但非常接近Java源代码):

var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
            .RequestIdToken("OAuth Client Id goes here")
            .Build(); 

它应该工作。

答案 2 :(得分:0)

您需要在活动中覆盖onActivityResult方法。添加以下代码:

if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        }
    }

这就是handleSignInResult方法的样子:

private void handleSignInResult(GoogleSignInResult result) {
    if (result.isSuccess()) {
        GoogleSignInAccount googleSignInAccount = result.getSignInAccount();
        if (googleSignInAccount != null) {
            String userId = googleSignInAccount.getId();
        }
        updateUI(true);
    } else {
        updateUI(false);
    }
}

您还需要在Firebase帐户中Authentication - &gt;启用此功能SIGN-IN METHOD - &gt; the provider。您需要启用正在使用的版本,Email/PasswordGoogle等等。

您还需要将compile 'com.google.firebase:firebase-auth:10.2.0'放入build.gradle文件中。

在AndroidManifest中,您必须设置以下2个权限:<uses-permission android:name="android.permission.INTERNET"/>' and '<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

您还需要设置SHA1。 Here你可以看看如何做到。最后,不要忘记将google-services.json再次放在正确的位置。

这就是firebaseAuthWithGoogle方法的样子:

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    System.out.println("firebaseAuthWithGoogle:" + acct.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    System.out.println("signInWithCredential:onComplete:" + task.isSuccessful());

                    if (!task.isSuccessful()) {
                        System.out.println("signInWithCredential" + task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

非常重要的是,不要忘记在onStart方法中添加此代码:

@Override
public void onStart() {
    super.onStart();

    OptionalPendingResult<GoogleSignInResult> optionalPendingResult = Auth.GoogleSignInApi.silentSignIn(googleApiClient);
    if (optionalPendingResult.isDone()) {
        GoogleSignInResult googleSignInResult = optionalPendingResult.get();
        handleSignInResult(googleSignInResult);
    } else {
        optionalPendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
            @Override
            public void onResult(@NonNull GoogleSignInResult googleSignInResult) {
                handleSignInResult(googleSignInResult);
            }
        });
    }
    auth.addAuthStateListener(authListener);
}

希望它有所帮助!

答案 3 :(得分:0)

现在您需要配置项目以在项目中添加google signIn的功能,这里是链接 enter link description here

答案 4 :(得分:-1)

@Alex感谢您的回答。很糟糕,我像你说的那样做了:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQ_CODE){
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleResult(result);
    }
}

//and here the handleResult methode

private void handleResult(GoogleSignInResult result){
    if (result.isSuccess()){

        // Google Sign In was successful, authenticate with Firebase
        GoogleSignInAccount account = result.getSignInAccount();

        String name = account.getDisplayName();
        String email = account.getEmail();

        googleProfilName.setText(name);
        googleProfilEmail.setText(email);


        if (account.getPhotoUrl() != null) {
            String img_url = account.getPhotoUrl().toString();
            Glide.with(this).load(img_url).into(profilPic);
        }


        firebaseAuthWithGoogle(account);

        updateUI(true);
    }
    else{
        updateUI(false);
    }
}

答案 5 :(得分:-1)

好了我的更新代码:

private void signInGoogle(){
    Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleSignInApi);
    startActivityForResult(intent, REQ_CODE);
}

...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

    if (requestCode == REQ_CODE){
        GoogleSignInAccount account = result.getSignInAccount();
        handleResult(result);
    }
}

...


private void handleResult(GoogleSignInResult result){
    if (result.isSuccess()){

        // Google Sign In was successful, authenticate with Firebase
        GoogleSignInAccount account = result.getSignInAccount();

        String name = account.getDisplayName();
        String email = account.getEmail();

        googleProfilName.setText(name);
        googleProfilEmail.setText(email);

        if (account.getPhotoUrl() != null) {
            String img_url = account.getPhotoUrl().toString();
            Glide.with(this).load(img_url).into(profilPic);
        }

        String idTest = account.getId();

        firebaseAuthWithGoogle(account);

        updateUI(true);
    }
    else{
        updateUI(false);
    }
}

...



private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    System.out.println("signInWithCredential:onComplete:" + task.isSuccessful());

                    if (!task.isSuccessful()) {
                        System.out.println("signInWithCredential" + task.getException());
                        Toast.makeText(SignIn.this, "Authentication failed.",Toast.LENGTH_SHORT).show();
                    }
                }
            });

}