升级 Firebase 后出现的 OAuth2 问题

8

我有一个工作中的安卓应用(或许最好说是曾经有过)。

该应用使用了一些第三方库,包括:谷歌地图、Firebase和firebaseui。

在将应用程序转换为使用新版Firebase后,我遇到了两个主要问题:

  1. firebaseui登录界面已更改,现在看起来像这样(从登录对话框变成了活动):

sign in screenshot

这当然与旧版本完全不同,并且由于某种奇怪的原因与调试构建变体也不同。

  1. 我无法使用Google登录,日志中显示以下错误:

com.google.firebase.FirebaseException: An internal error has occured. [ OAuth2 client id in server configuration is not found. ]

同样的问题在调试变体中没有发生。

需要明确的是,调试构建变体使用相同的代码库,但使用不同的Firebase数据库。

2个回答

6

针对以下错误:

com.google.firebase.FirebaseException: 出现内部错误。 [ OAuth2 服务器配置中未找到客户端 ID。 ]

  1. 您需要先转到您的Google开发者控制台的凭据类别(https://console.developers.google.com/apis/credentials),然后查找自动生成的OAuth 2.0客户端ID,名称类似于“Web客户端(由Google服务自动创建)”,保留与此客户端ID相关的数据。

  2. 进入Firebase控制台的“Auth”类别,然后转到“连接模式”选项卡,打开谷歌身份验证设置,最后展开Web SDK设置。现在粘贴之前找到的OAuth客户端ID及其密钥,并保存设置。

更改后的设置是关于Web设置的,但似乎被Firebase Android组件使用。


1
使用新版 Firebase 后,他们改变了很多代码和操作方式。
现在,在设置 Firebase 项目时,他们提供了一个选项让你输入 AuthId,你可以下载 JSON 并将其粘贴到应用中。
在设置 ClientId 后,你可以添加以下代码来使 Google 登录恢复正常。
 Button signInButton;
 //Google Variables
 private static final int RC_SIGN_IN = 9001;
 private GoogleApiClient mGoogleApiClient;

 //Firebase Variables
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;

//Inside OnCreate();
//Google SignIn Methods
    // [START config_signin]
    // Configure Google Sign In
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();
    // [END config_signin]

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


    mAuth = FirebaseAuth.getInstance();

    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            updateUI(user);
        }
    };

 @Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthStateListener);
    mGoogleApiClient.connect();
}


@Override
protected void onStop() {
    super.onStop();
    if(mAuthStateListener != null) {
        mAuth.removeAuthStateListener(mAuthStateListener);
    }
    mGoogleApiClient.disconnect();
}

// [START onactivityresult]
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            // Google Sign In failed, update UI appropriately
            // [START_EXCLUDE]
            updateUI(null);
            // [END_EXCLUDE]
        }
    }

}
// [END onactivityresult]


private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    // 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()) {
                        Toast.makeText(LoginActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
}
// [END auth_with_google]

// [START signin]
private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}
// [END signin]

   private void updateUI(FirebaseUser user) {
    if (user != null) {
      //write what you want to do after login here  
    }
}


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

 public void GoogleSignIn(View v){
    signIn();
}


@Override
protected void onRestart() {
    super.onRestart();
    mGoogleApiClient.connect();
}

这在我的应用程序中完全适用于使用Firebase进行Google身份验证。

谢谢您的回答,但这并不完全是我要问的。我想使用Firebaseui库,这个库应该可以简化事情。 - CaptainNemo
尝试实现答案,但是收到了相同的错误: 发生了内部错误。[在服务器配置中找不到OAuth2客户端ID。] - CaptainNemo
你能否尝试在开发者控制台重新配置OAuth2,然后在Firebase项目中使用新的id吗?我曾经也遇到过同样的问题,结果发现我的OAuth客户端id出了问题。 - Siddhesh Dighe

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