Вопрос или проблема
В Android Studio я получаю следующую ошибку Kotlin в Logcat:
[RequestTokenManager] getToken() -> BAD_AUTHENTICATION. Приложение: com.example.packagename, Сервис: oauth2:openidamnk: Долговечные учетные данные недоступны.
Когда я нажимаю кнопку Войти с помощью Google в своем приложении, я получаю эту ошибку из блока catch для исключения: Нет доступных учетных данных.
Я смотрел на это в течение нескольких часов и не могу разобраться. Это не дубликат, потому что другие ответы старше 3 лет, и ни одно решение не сработало для меня.
Вот мой код:
fun sighInWithGoogle(
context: Context,
auth: FirebaseAuth
) {
val rawNonce = UUID.randomUUID().toString()
val bytes = rawNonce.toByteArray()
val md = MessageDigest.getInstance("SHA-256")
val digest = md.digest(bytes)
val hashedNonce = digest.fold("") { str, it ->
str + "%02x".format(it)
}
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()
val googleSignRequest: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
val credentialManager = CredentialManager.create(context)
CoroutineScope(Dispatchers.IO).launch {
try {
val result = credentialManager.getCredential(
request = googleSignRequest,
context = context,
)
handleGoogleSignIn(context, auth, result)
} catch (e: GetCredentialException) {
handleGoogleSignInFailure(context, e)
}
}
}
private fun handleGoogleSignInFailure(context: Context, e: Exception) {
Log.e("TAG", "Неожиданная ошибка: ${e.message.toString()}")
postToastMessage("Ошибка входа в Google: ${e.message.toString()}")
}
Я исправил это, установив setFilterByAuthorizedAccounts в false вместо true. Когда это true, он проверяет любой аккаунт, с которым пользователь уже вошел в ваше приложение. Если пользователь никогда не входил ранее с любым из своих аккаунтов Google, тогда это должно быть false.
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()
Ответ или решение
Ошибка BAD_AUTHENTICATION в RequestTokenManager: Решение проблемы
В процессе разработки приложений на Android вы можете столкнуться с различными ошибками аутентификации, среди которых ошибка BAD_AUTHENTICATION
, возникающая при вызове метода getToken()
в классе RequestTokenManager
. Давайте рассмотрим вашу проблему более детально и объясним, как ее решить.
Описание проблемы
При нажатии на кнопку «Войти с Google» в вашем приложении вы столкнулись с ошибкой в Logcat:
[RequestTokenManager] getToken() -> BAD_AUTHENTICATION. App: com.example.packagename, Service: oauth2:openidamnk: Long live credential not available.
Выполнение кода остановилось на блоке catch
, где было выдано сообщение об отсутствии доступных учетных данных: No credentials available
.
Такие проблемы могут возникнуть по различным причинам, включая проблемы с настройками API, некорректную конфигурацию клиента или неправильное использование методов аутентификации.
Анализ кода
Ваш код для аутентификации выглядит следующим образом:
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()
Вы указали setFilterByAuthorizedAccounts(true)
, что приводит к поиску только тех учетных записей Google, которые были ранее авторизованы в вашем приложении. Если у пользователя отсутствует авторизованная учетная запись, вызов getToken()
завершится неудачно с ошибкой BAD_AUTHENTICATION
.
Решение
Вы правильно отметили, что изменения параметра setFilterByAuthorizedAccounts
на false
помогли решить проблему:
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()
Изменив этот параметр, вы разрешаете попытку аутентификации с любой учетной записи Google, даже если пользователь никогда не входил в ваше приложение ранее. Это решение особенно полезно для новых пользователей.
Рекомендации по улучшению
-
Убедитесь в правильности настройки проекта: Проверьте, правильно ли настроены все API-ключи и идентификаторы клиента в вашей консоли Google Cloud, а также в проекте Firebase.
-
Отладка данных аутентификации: Включите детализированный вывод логов для аутентификации, чтобы получить больше информации о процессе аутентификации и любых возникающих ошибках.
-
Кросс-платформенные тесты: Тестируйте вашу аутентификацию на различных устройствах и версиях Android, чтобы исключить проблему конфигурации.
Заключение
Ошибка BAD_AUTHENTICATION
в RequestTokenManager
может возникнуть из-за неправильной настройки фильтрации авторизованных учетных записей. Правильное установление параметра setFilterByAuthorizedAccounts
на false
позволяет избежать этой проблемы и предоставляет возможность новым пользователям авторизоваться в вашем приложении. Следуя предложенным рекомендациям, вы сможете улучшить стабильность и удобство использования вашей системы аутентификации.
Если у вас остались вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться к сообществу разработчиков или использовать официальную документацию Google и Firebase.