首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoogleSignInAccount getIdToken()为空

GoogleSignInAccount getIdToken()为空
EN

Stack Overflow用户
提问于 2017-04-03 07:57:23
回答 5查看 12K关注 0票数 15

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

代码语言:javascript
复制
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]
          }
      });

}
EN

回答 5

Stack Overflow用户

发布于 2017-10-01 18:22:42

也许您忘记了requestIdToken()对您的GoogleSignInOptions对象

试一试:

代码语言:javascript
复制
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
票数 24
EN

Stack Overflow用户

发布于 2017-08-06 04:05:54

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

代码语言:javascript
复制
var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
            .RequestIdToken("OAuth Client Id goes here")
            .Build(); 

那就行了。

票数 9
EN

Stack Overflow用户

发布于 2017-04-03 09:35:50

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

代码语言:javascript
复制
if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        }
    }

您的handleSignInResult方法应该是这样的:

代码语言:javascript
复制
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 -> SIGN-IN METHOD -> the provider。您需要启用正在使用的Email/PasswordGoogle等。

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

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

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

firebaseAuthWithGoogle方法应该是这样的:

代码语言:javascript
复制
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方法中添加以下代码:

代码语言:javascript
复制
@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);
}

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43179362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档