Новый знак 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
Это не мое дело, поскольку я уже выбрал учетную запись. Любая идея в чем может быть причина?
Ответы
Ответ 1
У меня была точно такая же проблема, и я нашел решение.
Если вы следуете приведенной здесь документации:
https://developers.google.com/identity/sign-in/android/start-integrating
На первом этапе вам нужно создать файл конфигурации (который создает для вас идентификатор клиента OAuth 2.0 и вставляет его в google-services.json)
Затем позже он снова говорит о создании идентификатора клиента OAuth 2.0, но на этот раз он говорит, что вам нужно сделать это для веб-приложения
И это запутанная часть! (по крайней мере, для меня), потому что я просто взял идентификатор клиента, созданный для андроида OAuth, а не создавал новый для веб-приложения (я думал, что документация просто избыточна или что-то еще)
Как говорится, именно этот, и только тот, который вы должны использовать в качестве параметра методов requestIdToken или requestServerAuthCode.
Забудьте об использовании идентификатора OAuth Android в этих методах, потому что тогда вы получите все время отклик 12501 уродливого кода состояния.
Я думаю, что основная проблема заключается в том, что документация немного запутанна. Или, может быть, потому, что немного странно, что вам нужно создать два идентификатора OAuth.
Итак, в качестве сводки вам нужны два идентификатора OAuth, один для android и один для веб-приложения, и вы должны установить их в нужном месте.
Ответ 2
Я боролся с этим и потратил впустую почти неделю.
Вот как я сработал.
- Импорт проекта в AndroidStudio
- Создать хранилище отладки для проекта.
- Создайте подпись SHA1 для проекта, используя хранилище отладки.
- Используя подпись SHA1, зарегистрируйте свое приложение для входа в Google на консоли разработчика Google.
- Создайте там файл конфигурации Google. (Вставьте в папку приложения Android Studio)
- Используйте идентификатор веб-клиента из учетных данных OAuth 2.0 в своем проекте Android.
- Теперь из Android Studio создайте сборку отладки (APK) вашего проекта.
- Подключите устройство в вашей системе → скопируйте эту подписанную отладочную версию APK и установите ее.
Последние три действия 6, 7 и 8 - это то, что вам действительно нужно позаботиться. Если вы запускаете проект напрямую, APK фактически не подписывается с хранилищем отладки, и Google не распознает его вообще.
Ответ 3
У меня была та же проблема, после решения исследования он возобновил, что 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 keystore, 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"
}
}
],
Ответ 4
Я получал ту же проблему, потому что я создал идентификатор клиента типа приложения Android
![]()
Вместо этого я удалил его и создал идентификатор клиента типа веб-приложения, и я избавился от этой проблемы.
Ответ 5
Просто выясните, как это решить... Я получал эту ошибку при попытке запустить отладочную версию моего приложения... Чтобы исправить это, добавьте учетные данные для вашего приложения отладки на консоли разработчика, а также на Google-services.json.
это исправило это для меня!
Ответ 6
У меня была та же проблема, и я решил с помощью следующего решения:
- Создайте файл конфигурации (google-services.json), как описано здесь, и поместите в каталог вашего проекта/приложения
- (Как упоминалось в других ответах) Использование идентификатора клиента веб-приложения для метода
requestIdToken
.
- [Моя основная проблема] Подпишите свое приложение, если вы работаете в режиме отладки, как показано ниже:
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
}
}
buildTypes {
release {
...
}
debug {
...
signingConfig signingConfigs.release
}
}
Ответ 7
В моем случае я также должен был проверить, что отладочный SHA-1 был добавлен как действительный клиент Android OAuth.
Ответ 8
Теперь я понял.
Итак, сначала вы должны следовать верхним ответам, говоря:
1. создать идентификатор клиента OAuth для веб-приложений в Google Developers Console и использовать его в requestIdToken()
(избавиться от кода состояния 12501)
2. если вы создали идентификатор клиента OAuth Android для своего хэш-ключа производства, создайте новый идентификатор клиента OAuth Android для своего хэш-ключа отладки и интегрируйте его в свой google-services.json.
(избавиться от кода состояния 12500)
И вот последняя часть:
3. Вы не можете сразу вызвать requestIdToken()
и requestEmail()
. По крайней мере, в моем случае я избавился от Result: Status{statusCode=INTERNAL_ERROR, resolution=null}
, удалив requestEmail()
.
Так что удачи...
Ответ 9
Использовать веб-приложение как server_client_id, а не приложение для Android
Ответ 10
У меня была та же проблема, и я заметил, что код 12501 был возвращен, когда в моем server_client_id
содержалось некорректное значение.
Поскольку нет подробного сообщения, и документация по этому коду ошибки довольно плохая, я не знаю, имеет ли ваша проблема ту же причину, что и моя.
Мое приложение основано на коде Android от в этом примере (класс IdTokenActivity).
Чтобы он работал, мне также нужно было интегрировать вход в Google в мое приложение:
- сгенерированный файл конфигурации json с включенным входом Google
- добавлен плагин Google и зависимость от моего файла gradle
- создал идентификатор клиента OAuth для этого приложения и сохранил его в моем проекте как
server_client_id
Ответ 11
Является ли ваш apk в режиме отладки? Я думаю, что он работает только с подписанным apk.
Ответ 12
Ответ 13
Проблема, которую я имел, это то, что 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();
Ответ 14
Вместо R.string.server_client_id
просто используйте R.string.default_web_client_id
.
При копировании файла google-services.json в приложение оно автоматически создает это строковое значение. Вам не нужно копировать ключ из google-services.json в string.xml
Это сработало для меня.
Ответ 15
Я решил эту проблему, щелкнув поддержку Firebase в Android Studio, которая может быть неактуальной для пользователей, не являющихся пользователями Firebase.
- Перейдите в меню Tools- > Firebase
- Нажмите "Подключить ваше приложение к Firebase", оно будет отображаться как "Подключено" зеленым цветом после успешного соединения.
- Нажмите "Добавить Firebase Authentication" на кнопку приложения, она также станет зеленой.
ПРИМЕЧАНИЕ. Наличие огромного списка ответов в этом определенно подтверждает одно. Google нуждается в обновлении и подтверждении документации.
Ответ 16
Если ни один из вышеперечисленных параметров не работает, проверьте, является ли приложение applicationId в приложении build.gradle одинаковым с вашим именем пакета.
Ответ 17
Не знаю, почему, но SHA1 в андроид-студии автоматически изменяется, и поэтому я получаю эту ошибку. Чтобы решить эту проблему, я обновил SHA1 моих настроек проекта firebase новым SHA1 моей студии Android и снова начал работать.
Ответ 18
В моем случае мои учетные данные для Client ID for Android
на Консоль API Google содержали только SHA-1 для моего выпуска, подписанного APK. Android Studio использовала хранилище отладки по умолчанию для подписи моих отладочных сборников, и в этом случае отладочное хранилище SHA-1 не соответствовало клиенту Android SHA-1 онлайн. Моим решением было просто подписать отладочные сборки с хранилищем ключей выпуска.
В Android Studio, Build/Edit Build Types...
, затем выберите тип сборки отладки и убедитесь, что для параметра "Подписание" установлено ваше свидетельство о выпуске.
![Настройка подписки для освобождения]()
Ответ 19
У меня была такая же проблема и ошибка 12501, и не было выше для меня.
Моя проблема заключалась в том, что я использовал google Default web api, созданный для меня. после создания моей собственной ошибки api api пропал и работал нормально!
это следующие шаги:
- Сначала я создал отладочный ключ SHA1 и добавил в консоль Firebase. создавая SHA1 из здесь.
- создайте идентификатор клиента web api и android OAuth 2.0 из здесь
- создайте
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 и веб-приложения.
tip 2:, если вы из Ирана, как я, вы можете получить пользователя из Google, но вы не можете AuthWithGoogle
, а результат будет fail
в auth.signInWithCredential(credential)
, и вам нужно было использовать некоторый прокси-сервер для возврата true.
это рабочий полный источник FireBaseAuthDemo в github:
![enter image description here]()
надеюсь, что полная помощь
Ответ 20
Если вы используете отладочное хранилище для создания проекта, вам нужно добавить отпечаток SHA-1 debug.keystore в Firebase Console strong > .
- На Firebase Console откройте проект
- Перейдите к параметрам. Вкладка Общие
- В конце этой страницы есть поле для добавления Отпечатка пальца 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
Это все!
Ответ 21
У меня тоже была эта проблема, следуя инструкциям Google для Автоматически подписывать свое приложение. Если вы используете этот метод для подписывания своих приложений, вам нужно будет включить сгенерированный отпечаток хранилища ключей в свои учетные данные API.
В браузере проекта щелкните правой кнопкой мыши на своем приложении и выберите "Открыть модуль" Настройки.
![Снимок экрана с настройками Open Module | app | signed | config]()
Мне показалось, что он менее запутан, чтобы поместить файл .jks
в мой проект /app
. В любом случае запустите эту строку.
keytool -list -v -keystore /home/user/keystores/android.jks
Вам будет предложено ввести пароль. Не уверен, что это Key Password
или Store Password
, потому что мои одинаковые.: |
Консоль выплюнет кучу отпечатков сертификата. Возьмите SHA1 и перенесите его в свои учетные данные API в Консоль разработчика API Google. Вам нужно будет ввести его для Android-клиента OAuth 2.0 client IDs
, даже если вы фактически не используете этот client_id в своем приложении. Если вы используете другие API для android, поместите тот же SHA1 в соответствующие ключевые учетные данные в API keys
тоже.
Ответ 22
Очевидно, сначала проверьте правильность вашего ключа sha1 для выпуска. Но если он все еще не работает, и вы используете сервисы google play 8.4.0 (i.e.compile '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();
Ответ 23
Вот новый. Я пробовал 6 часов для входа в эмулятор с идентификатором из моего корпоративного домена Google Apps, безрезультатно, получив 12501 ошибок. По подозрению, я пробовал свой личный идентификатор gmail, и это сработало. То же самое, если бы я попробовал на своем телефоне свой корпоративный идентификатор. Оказывается, у эмулятора не было правильных настроек управления мобильным устройством, чтобы мой корпоративный идентификатор мог войти в систему.
Итак, если я хочу протестировать эмулятор с этим корпоративным идентификатором, мне нужно установить Google Play Store, затем программное обеспечение MDM и настроить его.
Ответ 24
Из моего странного опыта с этой ошибкой могу сказать, что вам также нужно попытаться перезагрузить телефон, чтобы избавиться от этой ошибки:)
Я был внедрен Google Sign In, используя учетные записи G Suite, которые назначены с помощью Google Admin. Таким образом, при первом знаке требовалось установить Device Policy. После того, как все последующие шаги были завершены, он просто выбросил ошибку 12501. В то же время одно и то же приложение отлично работало на других телефонах. Так помогла только перезагрузка. Но помогли
Ответ 25
Хотя в этом вопросе есть уже много утвержденных ответов, я изо всех сил пытался понять логику.
Итак, я придумываю свои исследования.
Чтобы получить 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
в ваш проект (создание файла выполняет необходимые шаги настройки).
Ответ 26
Попробуйте выполнить следующие шаги:
-
Клонировать следующий проект 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
}
}
Примечание. Ваше ключевое слово и ключевые слова должны быть одинаковыми при создании сертификата SHA-1.
Ответ 27
1.Сохранить подпись в файле gradle
signingConfigs {
config {
keyAlias 'appalias'
keyPassword 'hunter123'
storePassword 'hunter123'
storeFile file('path/to/keystore.jks')
}
}
2.Go для создания типов в структуре проекта (в Android Studio) и укажите, что signedConfigs для "config"
Теперь очистить ваш проект и создать его снова. Он должен работать.
Если вышеуказанное не работает, то ниже - последнее.
Попробуйте выполнить первый шаг и выполните сборку и проверку. Если он не работает, перейдите к следующему шагу и попытайтесь построить снова.
- Создайте подписанный apk (с подтверждением пароля).
- Перед подписанием проверьте имя файла хранилища ключей и тот, который вы дадите во время подписания apk (в студии android).
- Установите подписанный apk на свое устройство.
- Подождите пять минут.
- Попробуйте петь в google. Если все еще наступит 12501, подождите еще пять минут. Выполняя эту комбинацию gradle.
- Повторите попытку. Он должен работать.
Ответ 28
Поскольку приложение запрашивает Google вход с веб-представления, нам нужно создать идентификатор клиента auth client v2.0
-
Перейдите к Учетные записи Google API
Выберите проект Android в верхнем левом углу
2
-
Нажмите "Создать учетные данные" → Идентификатор клиента OAuth → Выбрать веб-сайт
Применение
-
Нажмите Ok
-
Теперь, если вы синхронизировали Android Studio с Firebase (вошли в систему)
просто перестроить проект В противном случае Скачать обновлено
google-services.json и замените существующий.
Он должен работать нормально.
Ответ 29
У меня тоже проблема, была решена следующим образом:
-
Я был создан, чтобы удалить ранее рассмотренный SHA1 и создать и установить новый SHA1.
-
сгенерируйте новый google-services.json
и установите в свой каталог приложений
-
Я использовал именно коды разработчика Google
-
my result.isSucces()
возвратил true после запуска проекта
как резюме, удалить старый sha1 и создать новый sha1 и загрузить новый google-services.json
Ответ 30
Я столкнулся с той же ошибкой 12501 status
. Это связано с несоответствием SHA-1 выпуска APK и отладки APK.
- Сделайте подписанный APK. Чтобы подписать APK, выберите существующий путь хранилища ключей, который вы использовали для создания SHA-1. например
/.android/debug.keystore
- Дайте псевдоним: androiddebugkey
- storepass и keypass: android.