7

我有一个可用的Android应用程序(也许更好说HAD)。升级后Firebase的OAuth2问题

该应用正在使用一些第三方库,包括:谷歌地图,Firebase,firebaseui。 转换应用程序以使用新的火力点我已经在两个主要问题绊倒后:

  1. 的firebaseui登录屏幕改变,现在看起来是这样的(从登录对话框,它变成了活动):

sign in screenshot

这当然是完全不同于旧的和一些奇怪的原因不同于调试版本变体。

  • 我无法使用谷歌登入与logcat中示出了以下错误:
  • com.google.firebase.FirebaseException: An internal error has occured. [ OAuth2 client id in server configuration is not found. ]

    再次此问题不是在调试变体发生。

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

    回答

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

    这个工作完全没在我的应用程序

    +0

    谢谢你的答案,但这不完全是我所要求的。我想使用[Firebaseui](https://github.com/firebase/FirebaseUI-Android)库,它应该可以简化一些事情。 – CaptainNemo

    +0

    试图执行答案,但我收到相同的错误: 发生内部错误。[找不到服务器配置中的OAuth2客户端ID。 ] – CaptainNemo

    +0

    您是否可以尝试在开发人员控制台中重新配置OAuth2,然后在Firebase项目中使用新ID?我曾经遇到同样的问题,事实证明我的OAuth客户端ID已损坏。 –

    6

    对于下面的错误使用火力地堡谷歌认证:

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

    1. 你必须首先去你谷歌开发者控制台在凭证类别(https://console.developers.google.com/apis/credentials)中找到自动生成的OAuth 2.0客户端ID,名称类似于“Web客户端(自动创建由Google服务提供)“,保留与此客户ID相关的数据。

    2. 转到在“验证”类别火力地堡控制台,然后进入“连接方式”选项卡,打开谷歌身份验证设置,最后展开Web SDK设置。现在将以前找到的OAuth客户端ID与其密钥和保存设置粘贴。

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

    +1

    让我的一天!很好 – prembhaskal

    +1

    非常感谢..... –