3

У меня вопрос к людям, которые используют Firebase аутентификацию входа в Google:Последние изменения с Firebase Authentication via. Вход в Google?

Мое приложение, которое уже работает в течение нескольких месяцев, использует как вход в систему Google, так и параметры электронной почты/пароля для проверки подлинности Firebase. Однако около недели назад я заметил, что Google Sign-In перестала работать. Код не был изменен, также опция электронной почты/пароля работает так же, как обычно.

Я проверил документацию (https://firebase.google.com/docs/auth/android/google-signin), он все тот же (мое приложение копирует метод проверки подлинности из документации).

Вы столкнулись с аналогичной проблемой? Если да, скажите, пожалуйста, как я могу его решить.

Вот мой код связан с Google Вход в систему внутри моего LoginActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    ... 
    //--------Google Sign In 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build(); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
        Toast.makeText(LoginActivity.this, "Connection failed!", Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

    mGoogleBttn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      SignIn(); 
     } 
    }); 

} 

private void SignIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    mProgress.setMessage("Signing in with Google Account..."); 
    mProgress.show(); 
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    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 
      // ... 
      mProgress.dismiss(); 
      Toast.makeText(LoginActivity.this, "Google sign in failed!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); 

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        mProgress.dismiss(); 
        checkUserExist(); 

        // 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(LoginActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
} 

private void checkUserExist() { 
    final String user_id = mAuth.getCurrentUser().getUid(); 
    mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(user_id)) { 
       Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class); 
       mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(mainIntent); 
      } else { 
       Intent setupIntent = new Intent(LoginActivity.this, SetupActivity.class); 
       setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(setupIntent); 
      } 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 

Вот мое приложение и уровень проекта build.gradle файлы: https://gist.github.com/anonymous/2c9737e898ca2568129af63e61a30f16

+1

У меня была аналогичная проблема, но вне андроида. Когда мой входной код запускается, появляется окно, которое немедленно закрывается. Он спрашивал, разрешено ли использовать учетную запись. –

+0

Вы выяснили проблему и ее решение? Я столкнулся с тем же в iOS. –

+0

@ShashankAgarwal К сожалению, нет. –

ответ

1

Хорошо, я признаю одно - это не имеет никакого отношения к коду ... Мне удалось исправить эту проблему, и я объясню, как это сделать.

Я отлажена приложение с отладчиком, как я от хороших людей было рекомендовано в комментариях, и оказалось, что внутри метода onActivityResult() для Auth.GoogleSignInApi.getSignInResultFromIntent (данные) возвращал этот код ошибки результата:

Статус {StatusCode = DEVELOPER_ERROR, разрешение = нуль}

Это было более чем достаточно, чтобы понять, куда копать. Я посмотрел в консоль Firebase -> Project -> Настройки проекта -> Отпечатки SHA-1.

Что интересно - там был отпечаток пальца, тот, который я поставил раньше. В любом случае, я решил проверить, совпадает ли это с тем, что я получаю от Android Studio -> Gradle Projects -> внутри проекта/приложения/задач/android/folder, есть подписьReport, которая содержит SHA-1. К моему удивлению, отпечатки пальцев SHA-1 не совпали. В любом случае, я скопировал его из AS и добавил вторую строку внутри Firebase Console. Угадай, что? Он работает сейчас ...

У меня все еще есть много вопросов о том, почему это могло произойти, так как это произошло внезапно, как я объяснял ранее в своем вопросе.

Я надеюсь, что эта информация поможет другим, у кого была подобная проблема.Тем не менее, вопрос решен, но поскольку есть набор голосов Я вручу его человеку, который объяснит мне эту магию ...

+0

Так что это не может быть из-за несоответствия SHA-1 выпуска APK и отладки APK для приложения уже работают в течение нескольких месяцев. – Journey

+0

Это именно то, чего я не понимаю. Как это вообще возможно? Я ни разу не обновил приложение на устройстве, он просто прекратил подписываться внезапно. Кроме того, теперь у меня есть 2 сертификата SHA-1 в моей консоли Firebase ... Так что запутать. –

+1

Вы мигрировали на другую машину? Если вы перейдете на новую машину-разработчик, хранилище отладки, вероятно, будет иным, вам нужно также отложить отпечаток отпечатка SHA1. – Journey

-1

Это может быть случай -

  • На вашем устройстве вы добавили только одну учетную запись электронной почты, которая не авторизована в вашем приложении. Кроме этого, на вашем устройстве нет другой учетной записи.
  • Поэтому, когда вы нажимаете кнопку «Войти в систему Google», она автоматически берет эту учетную запись электронной почты. Но это не разрешено, поэтому он терпит неудачу.

Решение - Добавьте свою авторизованную учетную запись на свое устройство. Теперь, когда вы нажмете «Войти с помощью Gooogle», он отобразит всплывающее окно и спросит, какую учетную запись вы хотите выбрать. Выберите правильный, и вы должны войти в систему. Надеюсь, что помогает.

+0

Нет, это не тот случай. –

1

Поскольку OP нашло решение проблемы и уже ответило на это , Я попытаюсь объяснить случаи, по просьбе OP, которые могут быть реальными причинами проблемы. До этого давайте узнаем что-нибудь о keystores и certificates.

The documentation говорит:

Android требует, чтобы все APK-цифровой подписью с открытого ключа сертификата, прежде чем они могут быть установлены. Даже приложение, которое вы создаете и запускаете в течение периода разработки, должно быть подписано с сертификатом. Если вы не сделаете это вручную, Android Studio автоматически подпишет APK с помощью отладочного сертификата, созданного инструментами Android SDK. В первый раз, когда вы запускаете или отлаживаете свой проект в Android Studio, среда IDE автоматически создает хранилище и сертификат отладки в $HOME/.android/debug.keystore и устанавливает пароль хранилища ключей и ключей. Сертификат открытого ключа, также известный как цифровой сертификат или сертификат идентификации, содержит открытый ключ пары открытого/закрытого ключей, а также некоторые другие метаданные, идентифицирующие владельца ключа (например, имя и местоположение). Владелец сертификата имеет соответствующий закрытый ключ.

Когда вы подписываете APK, инструмент подписи прикрепляет сертификат открытого ключа к APK. Сертификат открытого ключа служит как «отпечаток пальца», который однозначно связывает APK с вами и вашим соответствующим личным ключом. Это помогает Android гарантировать, что любые будущие обновления вашего APK являются подлинными и исходят от оригинального автора.

A keystore - это двоичный файл, содержащий один или несколько закрытых ключей.

Каждое приложение должно использовать тот же сертификат на протяжении всей своей жизни, чтобы пользователи могли устанавливать новые версии в качестве обновлений приложения.

Назад к вопросу; после изучения проблемы Ор и с короткого разговора с ним я придумал следующий вывод:

  • Он должен использовать один хранилище ключей/сертификат для развития и другой сертификат для настройки проекта (firebase консоль).
  • С тех пор, как Google входил в течение нескольких месяцев, но останавливался в последнее время, он, должно быть, изменил хранилище ключей в последнее время.
  • Установлено, что он только что перешел на новое устройство разработки, и, следовательно, приложение, которое он построит, может иметь новый файл отладочного хранилища ключей и новый сертификат, который, по сути, будет отличаться от такового в настройке проекта.

Дело все еще остается загадкой, я позже знал, что ОП никогда не создавал или не запускал свое приложение с нового устройства.

P.S. Android Studio автоматически создает хранилище ключей и сертификат отладки в $ HOME/.android/debug.keystore и устанавливает пароль хранилища ключей и ключей при первом запуске или отладке вашего проекта. Это означает, что каждый компьютер, на котором вы работаете, генерирует новый SHA-1, если у вас нет копии предыдущего файла хранилища ключей и вы его используете.