安卓认证错误:"GetToken failed with status code: INVALID_AUDIENCE"

14

关于这个模糊的错误代码已经有几个问题了,但是没有一个能够解决我的问题,所以我会再试一次。首先,这里是登录的样板代码。

      GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail()
        .requestServerAuthCode("web app client ID copied from Dev API Console", false)
        .build();


  mGoogleApiClient = new GoogleApiClient.Builder(this).enableAutoManage(this, this).addApi(Auth
        .GOOGLE_SIGN_IN_API, gso).build();

  Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
  startActivityForResult(signInIntent, RC_SIGN_IN);

使用这段代码,我获得了一个对话框并可以选择适当的用户帐户。太棒了!但是,在 onActivityResult 中我得到了一个取消的代码,所以我检查了 logcat 并注意到标题中的错误消息。然后我搜索其他遇到此问题的人,但是没有能够弄清楚我的情况出了什么问题。

那么让我们勾选其他帖子中的常见问题。

  • Firebase 控制台显示我的应用程序已注册正确的 SHA-1 和 SHA-256 指纹
  • 发布版和调试版都使用相同的密钥库
  • 在 Google API 管理器中,我的“OAuth 同意屏幕”已配置
  • 我还验证了授权重定向 URI 的域名
  • 我重新下载了 Firebase GoogleServices.json 文件,只是为了确认
  • 没有包名问题。事实上,Firebase Analytics 在这个应用程序中运行得很好
  • 在 Play Store dev 控制台中,“设置->API 访问”中显示了我的 OAuth 客户端
  • 我的 Firebase 项目在 Play 商店 dev 控制台的“已链接的账户”设置部分中有链接
  • 我等了 10 小时,只是为了看看 Google 的后端是否需要时间来设置这个

为了便于搜索,在标题中的 logcat 错误消息之后,我得到了以下 logcat 打印。

您的 OAuth2 相关配置有误,请检查。详细错误信息:INVALID_AUDIENCE


你的应用程序使用的是哪个版本的Firebase? - Rosário Pereira Fernandes
@RosárioPereiraFernandes,我正在使用firebase/play-services 10.2版本。 - Justin
3个回答

2

您的Web客户端ID必须在与Firebase相同的用户帐户中生成,而不是您的Play Store帐户。在我的情况下,这两个帐户是分开的,谷歌抛出了这个错误,而不是正确地链接信息。我的Firebase帐户与我的Play Store帐户相关联,但显然这并不意味着Web客户端ID将被共享。我尝试了一些其他解决方案,例如链接API管理器帐户,但也没有起作用。您必须在API管理器帐户中创建与Firebase帐户相同的项目中生成Web客户端ID。


2
如何在Firebase中创建网站客户端ID? - Maulik patel

0
问题出在你的client_id上,是Google认证过程中的问题。从当前项目中删除该文件,然后添加一个新实例。这次要特别注意id。使用Android Studio生成Firebase的设置。你必须有一个具有多个客户端ID的项目。其中一个是为你的Android应用程序准备的,带有SHA。最安全的方法是删除你当前在Google控制台中的项目。然后重新创建它。然后在Android Studio中,选择工具= > Firebase,然后选择你想要集成的设置。我不建议手动添加。

你是如何准确地初始化你的认证实例的? - Remario
感谢您提供使用“工具”=>“Firebase”的提示。不幸的是,这只会重新下载相同的JSON文件,导致没有任何更改。正如所述,这是一个实时的Firebase项目。我绝对不会删除此项目并重新添加它。否则,数百万客户将无法使用该应用程序。 - Justin

0

将其实现到您的活动中

GoogleApiClient.OnConnectionFailedListener

设置这些私有变量

private GoogleApiClient mGoogleApiClient;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth mFirebaseAuth;
private static final int RC_SIGN_IN = 9001;

配置 Google 登录

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

mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

初始化FirebaseAuth

mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = mFirebaseAuth.getCurrentUser();
    if (mFirebaseUser == null) {
        // Not signed in, launch the Sign In activity
    } else {
        // Already signed in, launch the Home activity
        //You can use mFirebaseUser.getDisplayName() / getUid() / getEmail() /getPhotoUrl()

    }

登录方式

private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

onActivityResult()

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.e("Data",data.getExtras().toString());
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        Log.e("Result","status "+result.getStatus()+"Success"+result.isSuccess()+" "+result.getSignInAccount());
        if (result.isSuccess()) {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            // Google Sign In failed
            Log.e(TAG, "Google Sign In failed.");
        }
    }
}

firebaseAuthWithGoogle

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

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(SignInActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(SignInActivity.this, "Authentication Successful.",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

onConnectionFailed()

 @Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not
    // be available.
    Log.d(TAG, "onConnectionFailed:" + connectionResult);
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
}

登出方法

private void signOut() {
        Auth.GoogleSignInApi.signOut(mGoogleApiClient).
                setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(@NonNull Status status) {
                    }
                });
        mFirebaseAuth.signOut();
}

在每个节点上保留日志。 如果您正确遵循了所有要点并结合您制作的列表,它应该可以正常工作。


谢谢Ashutosh。不过,我已经在做所有这些了。正如所述,我在onActivityResult中获取了一个错误。如果你感兴趣,这是你的日志打印内容。结果:状态 Status {statusCode =未知状态代码:12501,resolution = null} Successfalse null - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接