问题描述
关于这个模糊的错误代码已经有几个问题,但是没有一个问题为我解决了这个问题,因此我将重试。 首先,这是用于登录的样板代码。
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
1楼
您的Web客户端ID必须在与Firebase相同的用户帐户中生成,而不是在Play商店帐户中生成。 就我而言,这两个帐户是分开的,并且Google抛出此错误,而不是正确地链接信息。 我的Firebase帐户已链接到我的Play商店帐户,但这显然并不意味着将共享Web客户端ID。 我尝试了其他一些解决方案,例如链接API Manager帐户,但这些方法也不起作用。 您必须在Firebase在与Firebase帐户相同的API Manager帐户中使用的同一项目中创建Web客户端ID。
2楼
问题出在您的client_id上,用于google auth身份验证。从当前项目中删除文件。然后添加一个新实例。 这次要特别注意id。 使用android-studio生成firebase的设置。 您必须有一个具有多个客户端ID的项目,其中一个是您的Android应用程序(带有SHA)。 最安全的选择是在Google控制台中删除当前项目。然后重新创建它。然后在android studio中转到tools => 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();
}
随时记录日志。 如果您正确地遵循了所有要点,并结合了清单,那么您应该可以使用。