Новый знак Google в Android
Я пытаюсь получить идентификатор токена пользователя, используя новые сервисы Google Play 8.3, и, как задокументировано, я передаю идентификатор сервера:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.server_client_id))
.requestEmail()
.build();
но я все еще получаю неуспешный результат, как показано ниже:
{statusCode=unknown status code: 12501, resolution=null}
и задокументировано здесь GoogleSignInStatusCodes
Вход был отменен пользователем. т. е. пользователь отменил некоторые решения для входа, например, выбор аккаунта или согласие OAuth.
Постоянное значение: 12501
Это не мой случай, так как я уже выбрал аккаунт. Есть идеи, в чем может быть причина?
32 ответа
У меня была точно такая же проблема, и я нашел решение.
Если вы следуете документации, найденной здесь: https://developers.google.com/identity/sign-in/android/start-integrating
На первом этапе вам нужно создать файл конфигурации (который создает для вас идентификатор клиента OAuth 2.0 и вставляет его в google-services.json).
Затем позже снова говорится о создании идентификатора клиента OAuth 2.0, но на этот раз говорится, что вы должны сделать это для веб-приложения.
И это запутанная часть! (по крайней мере для меня), потому что я просто использовал идентификатор клиента, созданный для OAuth для Android, а не создавал новый для веб-приложения (я думал, что документация просто избыточна или что-то в этом роде)
Как говорится, именно этот, и только этот, вы должны использовать в качестве параметра методов requestIdToken или requestServerAuthCode.
Забудьте об использовании Android OAuth ID в этих методах, потому что тогда вы все время будете получать некрасивый ответ с кодом состояния 12501.
Я думаю, что основная проблема заключается в том, что документация немного запутывает это. Или, может быть, потому, что немного странно то, что вам нужно создать два идентификатора OAuth.
Таким образом, в качестве резюме, вам нужно ДВА идентификатора OAuth, один для Android и один для веб-приложения, и вы должны установить каждый в правильном месте.
Я боролся с этим и потратил на это почти неделю.
Вот так у меня получилось.
- Импортировать проект в AndroidStudio
- Создать отладочное хранилище ключей для проекта.
- Создайте подпись SHA1 для проекта, используя хранилище ключей отладки.
- Используя подпись SHA1, зарегистрируйте свое приложение для входа в Google на консоли разработчика Google.
- Создайте там файл конфигурации Google (поместите в папку приложения Android Studio).
- Используйте идентификатор веб-клиента из учетных данных OAuth 2.0 в вашем проекте Android.
- Теперь из Android Studio создайте отладочную сборку (APK) вашего проекта.
- Смонтируйте устройство в своей системе -> скопируйте эту подписанную отладочную версию APK и установите ее.
Последние три шага 6, 7 и 8, это то, что вам действительно нужно позаботиться. Если вы запускаете проект напрямую, то APK фактически не подписан с хранилищем ключей отладки, и Google его вообще не распознает.
У меня была такая же проблема, после решения проблемы возобновилось, что server_client_id содержал какое-то неверное значение или ваш google_services.json не включал oauth_client с client_id, который зарегистрирован в вашем хранилище ключей.
requestIdToken(getString(R.string.server_client_id))
R.string.server_client_id
используйте идентификатор клиента OAuth 2.0 для веб-приложения. И идентификатор клиента OAuth для Android используется в google_services.json
Обычно мы используем 2 хранилища ключей, 1 с использованием отладочного хранилища ключей и 1 с использованием подписанного хранилища ключей для публикации. Поэтому, если мы хотим перейти в режим отладки и публикации, дважды зарегистрируйте свой идентификатор клиента OAuth для Android, 1 используя SHA1 из хранилища ключей отладки и 1 из подписанного хранилища ключей для публикации.
маленький пример в моем google_services.json
"oauth_client": [
{
"client_id": "xxx-client-id.com",
"client_type": 1,
"android_info": {
"package_name": "com.app.android",
"certificate_hash": "xxxhash"
}
},
{
"client_id": "yyy.client-id.com",
"client_type": 1,
"android_info": {
"package_name": "com.app.android",
"certificate_hash": "yyyhash"
}
}
],
Я получил ту же проблему, это потому, что я создал идентификатор клиента типа приложения Android
Вместо этого я удалил его, создал идентификатор клиента типа веб-приложения и избавился от этой проблемы.
Просто выясните, как решить эту проблему... Я получал эту ошибку при попытке запустить отладочную версию моего приложения... Чтобы исправить это, добавьте учетные данные для вашего приложения отладки в консоли разработчика, а также в google-сервисах..json.
это исправило это для меня!
У меня была та же проблема, и я решил следующее решение:
- Создайте файл конфигурации (google-services.json), как описано здесь, и поместите его в каталог проекта /app
- (Как уже упоминалось в других ответах) Использование идентификатора клиента веб-приложения для
requestIdToken
метод. - [Моя главная проблема] Подпишите свое приложение, если вы работаете в режиме отладки, как показано ниже:
signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... } debug { ... signingConfig signingConfigs.release } }
Теперь я понимаю.
Итак, сначала вы должны следовать верхним ответам:
- создайте идентификатор клиента OAuth для веб-приложений в консоли разработчиков Google и используйте его в
requestIdToken()
(избавиться от кода статуса 12501) - Если вы создали идентификатор клиента Android OAuth для своего производственного хеш-ключа, создайте новый идентификатор клиента Android OAuth для своего ключа отладки и интегрируйте его в свой google-services.json. (избавиться от кода статуса 12500)
Уже не действителен А вот и последняя часть:
3. Звонить нельзя requestIdToken()
а также requestEmail()
однажды. По крайней мере, в моем случае я избавился от Result: Status{statusCode=INTERNAL_ERROR, resolution=null}
удалив requestEmail()
,
Удачи...
Используйте веб-приложение как server_client_id, а не как приложение Android
В моем случае я также должен был проверить, что отладочный SHA-1 был добавлен как действительный клиент OAuth для Android.
У меня была проблема с SHA-1, который я генерировал как с неправильным псевдонимом. Псевдоним ДОЛЖЕН БЫТЬ androiddebugkey. Поэтому я поместил идентификатор OAuth для Android в свой файл google-service.json. Я поставил идентификатор веб-клиента в requestIdToken (). И в моем конкретном случае я сгенерировал SHA-1 с псевдонимом androiddebugkey.
google-services.json:
"oauth_client": [
{
"client_id": "ANDROID OAUTH ID-.....apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "br.com.packagename",
"certificate_hash": "SHA-1 HASH"
}
},{
"client_id": "WEB CLIEND ID......apps.googleusercontent.com",
"client_type": 3
}
]
Подпись часть:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
.requestEmail()
.build();
Я решил эту проблему, щелкнув Поддержка Firebase в Android Studio, которая может не относиться к пользователям, не использующим Firebase.
- Зайдите в меню Инструменты->Firebase
- Нажмите Подключить ваше приложение к Firebase, оно будет отображаться как Подключено зеленым, как только соединение будет установлено
- Нажмите кнопку Add Firebase Authentication для вашего приложения, кнопка также станет зеленой.
ПРИМЕЧАНИЕ: наличие огромного списка ответов в этом однозначно подтверждает одно. Google должен обновить и сохранить документацию безошибочной.
Ваш apk в режиме отладки? Я думаю, что это работает только с подписанным apk.
На месте R.string.server_client_id
Просто используйте R.string.default_web_client_id
,
Когда вы копируете файл google-services.json в приложение, оно автоматически создает это строковое значение. Вам не нужно копировать ключ из google-services.json в string.xml. Это сработало для меня.
- Следуйте за неоднозначным документом Google.
- Поместите google-services.json в каталог вашего проекта
Установите ваш gradle как /questions/46362635/obnovlenie-konflikta-versij-do-840/46362685#46362685
Установите server_client_id в string.xml . Это ваш идентификатор веб-клиента, а не Android-клиент
У меня была такая же проблема, и я заметил, что код 12501 был возвращен, когда мой server_client_id
содержал некоторое неверное значение.
Поскольку подробного сообщения нет и документация по этому коду ошибки довольно скудная, я не знаю, имеет ли ваша проблема ту же причину, что и моя.
Мое приложение основано на коде Android из этого примера (класс IdTokenActivity). Чтобы это работало, мне также нужно было интегрировать вход Google в свое приложение:
- сгенерированный файл конфигурации json с включенным входом в Google
- добавлен плагин Google и зависимость для моего файла Gradle
- создал идентификатор клиента OAuth для этого приложения и сохранил его в своем проекте как
server_client_id
Если вы используете хранилище ключей отладки для создания проекта, вам нужно добавить SHA-1-отпечаток debug.keystore на консоли Firebase.
- На вашей консоли Firebase откройте свой проект
- Перейти к параметрам. Вкладка General
- В конце этой страницы есть поле для добавления отпечатка пальца SHA-1.
- Вставьте SHA-1 в поле консоли.
Чтобы получить SHA-1 из debug.keystore:
Mac / Linux:
keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
Windows:
keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
https://developers.google.com/android/guides/client-auth
Это все!
Если ни один из указанных выше параметров не работает, проверьте, совпадает ли ваш applicationId в app build.gradle с именем вашего пакета.
Не знаю почему, но SHA1 в Android Studio изменяется автоматически, и именно поэтому я получаю эту ошибку. Чтобы решить эту проблему, я обновил SHA1 моих настроек проекта Firebase новым SHA1 моей Android-студии, и он снова начал работать.
Попробуйте выполнить следующие действия:
Клонировать следующий проект https://github.com/googlesamples/google-services
Следуйте инструкциям на https://developers.google.com/identity/sign-in/android/start
Используйте веб-клиент (автоматически созданный службой Google) и добавьте его в requestIdToken(...)
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build();
Убедитесь, что вы используете то же хранилище ключей, которое добавлено в проект Google. Например, если вы использовали следующую команду для генерации ключа SHA-1
keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
Затем добавьте следующий код в файл app/build.gradle внутри android { ... } [Решил мою проблему]
signingConfigs { debug { storeFile file("/home/ashwin/.android/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { signingConfig signingConfigs.debug } }
Примечание. Ваши keyPassword и keyAlias должны использоваться одинаково при генерации сертификата SHA-1.
У меня была та же самая проблема и ошибка 12501, и ни один из вышеупомянутых не работает для меня.
Моя проблема заключалась в том, что я использую веб-интерфейс Google Default, созданный для меня. после создания собственного web api ошибка исчезла и работала нормально!
это рабочие шаги:
- Сначала я создал ключ отладки SHA1 и добавил его в консоль Firebase. создавая SHA1 отсюда.
- создайте здесь и веб-API, и идентификатор клиента OAuth 2.0 для Android.
- генерироваться
google-service.json
из консоли Firebase и положить в папку приложения. - поставить этот код для
GoogleSignnOption
как это:
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken
("put the web app client Id that get from the link in developer console ")
.requestEmail().build();
Совет 1: Я обнаружил, что вы должны создать как Android, так и веб-приложение Client Id для работы.
Совет 2: если вы из Ирана, как я, вы можете получить пользователя от Google, но вы не можете AuthWithGoogle
и результат будет fail
в auth.signInWithCredential(credential)
и вам пришлось использовать какой-то прокси для возврата истины.
это рабочий полный источник FireBaseAuthDemo в github:
надеюсь, что помощь полная
Очевидно, сначала проверьте правильность вашего ключа sha1. Но если он по-прежнему не работает и вы используете сервисы Google Play 8.4.0 (т.е. компилируйте com.google.android.gms:play-services:8.4.0'), проблему можно решить, изменив объект GoogleSignInOption. Вместо:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
.build();
Вы должны использовать:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(Scopes.PLUS_LOGIN))
.requestScopes(new Scope(Scopes.PLUS_ME))
.requestEmail()
.build();
Это устраняет ошибку, возвращая statusCode=INTERNAL_ERROR ИЛИ statusCode = Ошибка 12501 ИЛИ statusCode = Ошибка 12500. Затем этот объект gso можно использовать для создания GoogleApiClient, как показано ниже:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API,gso)
// .addApi(Plus.API, null)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
// .addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
В моем случае мои учетные данные для Client ID for Android
на консоли API Google содержал только SHA-1 для моего релиза с подписанным APK. Android Studio использовала хранилище ключей отладки по умолчанию для подписи моих отладочных сборок, и в этом случае хранилище ключей отладки SHA-1 не соответствовало онлайн-клиенту SHA-1 Android. Мое решение состояло в том, чтобы просто подписать отладочные сборки с помощью хранилища ключей релиза.
В Android Studio Build/Edit Build Types...
, затем выберите тип сборки отладки и убедитесь, что для Signing Config задан сертификат выпуска.
1. Укажите signatureConfigs в вашем файле Gradle
signingConfigs {
config {
keyAlias 'appalias'
keyPassword 'hunter123'
storePassword 'hunter123'
storeFile file('path/to/keystore.jks')
}
}
2. Перейдите к типам сборки в структуре проекта (в Android Studio) и укажите signatureConfigs для "config"
Теперь очистите ваш проект и постройте снова. Он должен работать.
Если вышеупомянутое не работает, то ниже ваше последнее средство.
Попробуйте первый шаг, соберите и проверьте. Если это не работает, перейдите к следующему шагу и попробуйте собрать заново.
- Создайте подписанный APK (с помнить пароль проверен).
- Перед подписанием проверьте имя файла файла хранилища ключей, которое вы даете при подписании apk (в андроид студии).
- Установите подписанный apk на свое устройство.
- Подождите пять минут.
- Попробуйте петь в Google. Если по-прежнему 12501, подождите еще пять минут. При этом ударил синхронизацию Gradle.
- Попробуйте снова. Он должен работать.
Вот новый. Я пытался в течение 6 часов войти в эмулятор с идентификатором из моего корпоративного домена Служб Google, но безрезультатно, получив 12501 ошибок. Надеюсь, я попробовал свой личный идентификатор Gmail, и это сработало. То же самое, если я попробовал на своем телефоне с моим корпоративным идентификатором. Оказывается, в эмуляторе не было надлежащих настроек управления мобильными устройствами, чтобы мой корпоративный идентификатор мог войти в систему.
Поэтому, если я хочу протестировать на эмуляторе с этим корпоративным идентификатором, я должен установить Google Play Store, затем программное обеспечение MDM и настроить его.
Я разработал lib для добавления опции Google SignIn в ваше приложение с помощью всего лишь нескольких строк кода. Попробуйте HiGoogle- Google SignIn Made Easy
Используйте веб-приложение как server_client_id, а не как приложение Android. Передайте это в конструкторе HiGoogle.
У меня такая же проблема, была решена следующим образом:
Я был сделан, чтобы удалить ранее задуманный SHA1 и создать и установить новый SHA1.
генерировать новые
google-services.json
и установить в каталог моего приложенияЯ использовал именно коды разработчика Google
мой
result.isSucces()
вернул true после запуска проекта
В итоге, удалите старый sha1, создайте новый sha1 и загрузите новый google-services.json
Несмотря на то, что на этот вопрос уже есть много ответов, я пытался понять логику. Итак, я придумала свое исследование.
- Создайте приложение, используя правильное имя пакета и отпечаток сертификата подписи SHA-1 https://developers.google.com/mobile/add?platform=android&cntapi=signin
- Включить вход в Google
- Создайте файл конфигурации.
Чтобы получить SHA-1, запустите это в терминале:
keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v
Около OAuth 2.0 client IDs
- OAuth для Интернета (в приложении это используется как
server_client_id
) - OAuth для Android (это необходимо создать, используя правильное имя пакета и отпечаток сертификата подписи SHA-1).
Если вы используете другое хранилище ключей для отладки и выпуска, вам нужно создать отдельный
OAuth 2.0 client IDs
используя соответствующее имя пакета и SHA-1.
Вы можете создавать или редактировать свои OAuth 2.0 client IDs
здесь https://console.developers.google.com/apis/credentials?project=
- Переход к вашему приложению.
- Если у вас уже есть OAuth для Android, нажмите на его имя и проверьте имя пакета и SHA-1.
Мы можем использовать одно и то же хранилище ключей как для отладки, так и для выпуска, сохранив сведения о хранилище ключей в глобальном (локальном, а не внутри проекта) gradle.properties
и получить его в build.gradle
как ниже.
def key_alias = ""
def key_password = ""
def store_file = ""
def store_password = ""
try {
key_alias = YOUR_KEY_ALIAS
key_password = YOUR_KEY_PASSWORD
store_file = YOUR_KEYSTORE_PATH
store_password = YOUR_KEYSTORE_PASSWORD
} catch (Exception exception) {
throw new IllegalStateException('Failed to find key store details. Social Login is disabled');
}
android {
signingConfigs {
config {
keyAlias key_alias
keyPassword key_password
storeFile file(store_file)
storePassword store_password
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
// ...
}
release {
signingConfig signingConfigs.config
// ...
}
}
}
Вы можете использовать ниже фрагмент
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// ...
} else if (result.getStatus().getStatusCode() == CommonStatusCodes.NETWORK_ERROR) {
// No internet connection
} else if (result.getStatus().getStatusCode() == CommonStatusCodes.DEVELOPER_ERROR) {
// Wrong server OAuth key(server_client_id)
} else if (result.getStatus().getStatusCode() == 12501) {
// Wrong app signing-certificate fingerprint SHA1
} else {
Log.e("Google sign in error", result.getStatus().toString());
}
}
}
Примечание. Если вы включили только вход в Google при создании файла конфигурации, вам не нужно добавлять
google-servies.json
файл в вашем проекте. (создание файла выполняет необходимые шаги настройки).
Исходя из моего странного опыта с этой ошибкой, я могу сказать, что вам также нужно попытаться перезагрузить свой телефон, чтобы избавиться от этой ошибки:) Я реализовал вход в Google с использованием учетных записей G Suite, для которых политика устройства назначена через Google Admin, Поэтому при первом входе в систему требовалось установить приложение Device Policy. После того, как все последующие шаги были выполнены, это просто выдало ошибку 12501. В то же время то же самое приложение прекрасно работало на других телефонах. Так что помогла только перезагрузка. Но помог
Я столкнулся с тем же 12501 status
ошибка. Это связано с несоответствием SHA-1 выпуска APK и отладки APK.
- Сделайте подписанный APK. Чтобы подписать APK, выберите существующий путь к хранилищу ключей, который вы использовали для создания SHA-1. например
/.android/debug.keystore
- Дать псевдоним-имя: androiddebugkey
- Storepass и Keypass: Android.
У меня тоже была эта проблема после того, как я следовал инструкциям Google для автоматической подписи вашего приложения. Если вы используете этот метод для подписи своих приложений, вам нужно будет включить сгенерированный отпечаток хранилища ключей в свои учетные данные API.
В браузере проекта щелкните правой кнопкой мыши свое приложение и выберите "Открыть настройки модуля".
Я нашел это менее запутанным, чтобы поставить .jks
файл в моем проекте /app
каталог. В любом случае запустите эту строку на нем.
keytool -list -v -keystore /home/user/keystores/android.jks
Вам будет предложено ввести пароль. Не уверен, что это Key Password
или же Store Password
потому что мои одинаковы.:|
Консоль будет выдавать кучу отпечатков сертификатов. Возьмите SHA1 и вставьте его в свои учетные данные API на консоли разработчика Google API. Вам нужно будет ввести его для клиента Android OAuth 2.0 client IDs
даже если вы на самом деле не используете этот client_id в своем приложении. Если вы используете другие API для Android, поместите тот же SHA1 в соответствующие учетные данные ключа в API keys
тоже.