Android 身份验证错误:“GetToken 失败,状态码:INVALID_AUDIENCE”

Posted

技术标签:

【中文标题】Android 身份验证错误:“GetToken 失败,状态码:INVALID_AUDIENCE”【英文标题】:Android Auth Error: "GetToken failed with status code: INVALID_AUDIENCE" 【发布时间】:2017-07-05 19:35:45 【问题描述】:

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

      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 商店开发控制台中,我的 OAuth 客户端显示在“设置->API 访问”中 我的 Firebase 项目已在 Play 商店开发控制台的“关联帐户”设置部分中关联 我已经等了 10 个小时,只是想看看 Google 的后端是否需要时间来设置它

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

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

【问题讨论】:

您在应用中使用的是哪个版本的 firebase? @RosárioPereiraFernandes,我使用的是 firebase/play-services 10.2 版。 【参考方案1】:

您的网络客户端 ID 必须在与 Firebase 相同的用户帐户中生成,而不是在您的 Play 商店帐户中生成。就我而言,这两个帐户是分开的,Google 会抛出此错误,而不是正确链接信息。我的 Firebase 帐户已链接到我的 Play 商店帐户,但这显然并不意味着网络客户端 ID 将被共享。我尝试了一些其他解决方案,例如链接 API Manager 帐户,但也没有用。您必须在 Firebase 在与您的 Firebase 帐户相同的 API Manager 帐户中使用的同一项目中创建 Web 客户端 ID。

【讨论】:

如何在firebase中创建网站客户端ID?【参考方案2】:

问题在于您的 client_id,用于 google 身份验证过程。从当前项目中删除文件。然后添加一个新实例。这次要特别注意id。使用 android-studio 生成 firebase 的设置。 您必须有一个具有多个客户端 ID 的项目 一个是用于您的 android 应用程序的,带有 SHA。最安全的选择是在 google 控制台中删除您当前的项目。然后重新创建它。然后在 android studio go tools=> firebase 中选择您要集成的设置。我不建议手动添加。

【讨论】:

您是如何准确初始化您的身份验证实例的? 感谢您提供有关使用工具 => Firebase 的提示。不幸的是,这只重新下载了相同的 JSON 文件,导致没有任何变化。如前所述,这是一个实时的 Firebase 项目。我肯定不会删除这个项目并重新添加它。数以百万计的客户将拥有一个损坏的应用程序。【参考方案3】:

实施您的活动

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

在每个点都保留日志。 如果您按照所有要点正确结合您制作的列表,它应该可以工作。

【讨论】:

谢谢阿舒托什。但是,我已经在做所有这些了。如前所述,我在 onActivityResult 中遇到错误。如果您好奇,这里是您的日志打印的内容。结果:status StatusstatusCode=unknown status code: 12501, resolution=nullSuccessfalse null

以上是关于Android 身份验证错误:“GetToken 失败,状态码:INVALID_AUDIENCE”的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT Bearer 进行身份验证不起作用,调试表明问题出在 GetToken() 函数内部

带有 UserInterface 和 getToken 的 Symfony 错误

Symfony2 测试中的伪造身份验证 - 控制器上的 get('security.context')->getToken() 返回的令牌与 TestCase 中设置的令牌不同

com.google.android.gms.auth.GoogleAuthException:getToken(未知来源)异常

Cordova Android 应用 Google Plus 身份验证错误 10

Cordova Android 应用 Google Plus 身份验证错误 10