【问题标题】:OAuth2 issues after upgrading firebase升级 firebase 后的 OAuth2 问题
【发布时间】:2016-10-12 15:34:36
【问题描述】:

我有一个可以运行的 android 应用程序(最好是 HAD)。

该应用正在使用一些第三方库,包括:Google 地图、Firebase、firebaseui。 在将应用程序转换为使用新的 firebase 后,我偶然发现了两个主要问题:

  1. firebaseui 登录屏幕发生了变化,现在看起来像这样(从登录对话框变成了活动):

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

  1. 我无法使用 google 登录,logcat 中显示以下错误:

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

同样,这个问题在调试变体中没有发生。

为了清楚起见,调试构建变体使用相同的代码库,但使用不同的 firebase 数据库。

【问题讨论】:

    标签: android firebase oauth-2.0 firebase-authentication firebaseui


    【解决方案1】:

    对于以下错误:

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

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

    2. 进入“Auth”类别中的Firebase console,然后进入“Connection mode”选项卡,打开Goog​​le authentication settings,最后展开Web SDK settings。现在粘贴之前找到的 OAuth 客户端 ID 及其密钥并保存设置。

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

    【讨论】:

      【解决方案2】:

      借助 New 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 库。
      • 尝试实施答案,但收到相同的错误:发生内部错误。 [未找到服务器配置中的 OAuth2 客户端 ID。 ]
      • 您可以尝试在开发者控制台中重新配置您的 OAuth2,然后在 Firebase 项目中使用新的 id 吗?我曾经遇到过同样的问题,结果发现我的 OAuth 客户端 ID 已损坏。
      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多