Подтвердить что ты не робот

Новый знак 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

Это не мое дело, поскольку я уже выбрал учетную запись. Любая идея в чем может быть причина?

4b9b3361

Ответ 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

  • Следуйте двусмысленному документу google.
  • Поместите google-services.json в каталог проекта
  • Установите gradle как fooobar.com/questions/32798/...

  • Установите server_client_id в файле string.xml. Ваш идентификатор веб-клиента не поддерживает android client

Ответ 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.