Ошибка 12501 аутентификации с помощью входа в Google

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

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail().build();

Затем я понял, что мне также нужно запросить токен идентификатора, чтобы иметь возможность аутентифицироваться в моем бэкэнде, поэтому я сделал:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(String.valueOf(R.string.server_client_id))
                    .requestEmail().build();

Проблема в том, что после изменений я не могу войти в систему. Статус, который я получаю каждый раз, когда пытаюсь войти, Status{statusCode=unknown status code: 12501, resolution=null},

Я искал вокруг, и я нашел этот пост, который в значительной степени об одном и том же. Однако я не допустил ошибок, названных людьми, которые ответили, oAuth Client ID в моей консоли разработчика предназначен для веб-приложения: clientIDs А также R.string.server_client_id первый идентификатор клиента с картинки. Имена пакетов, конечно, правильные во всех помещениях, иначе без запроса токена он не будет работать. 2 человека также предположили, что приложение должно быть подписано, чтобы это работало, но в документации googles говорится, что ключ отладки тоже должен работать, и не имеет смысла заставлять людей подписывать приложения для отладки.

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

13 ответов

Решение

Ну, это очень неловко, но я понял это:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(AuthenticatedActivity.this.getResources().getString(R.string.server_client_id))
                    .requestEmail().build();

Я отправлял ему идентификатор ресурса вместо разыменованного строкового ресурса.

Очевидно, сначала проверьте правильность вашего ключа 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(); 

Смотрите это для деталей: Google Signin не работает на выпускной версии Android

Убедитесь, что вы добавили отпечаток SHA-1 для подписывающего ключа (релиза) в консоль Firebase

Найдите свой ключ SHA1: keytool -exportcert -list -v -alias <your-key-name> -keystore <path-to-production-keystore>

Добавьте его в консоль Firebase: перейдите на https://console.firebase.google.com/, выберите свое приложение, выберите настройки.

В моем проекте у меня был файл приложения, отличный от идентификатора пакета в моем файле manifest.xml, и это было источником моей проблемы.

Ключ Android, который я должен был создать, должен был иметь applicationId fqdn, а НЕ имя пакета (вопреки тому, что говорит вам Google), чтобы он работал для меня.

Думаю, я оставлю это здесь на случай, если это сэкономит время кому-то.

У меня была эта проблема, когда я случайно использовал идентификатор клиента приложения Android вместо Webapp в качестве requestIdToken() параметр.

Там вы должны использовать идентификатор клиента веб-приложения. По умолчанию это называется Web client (auto created by Google Service)

1. Укажите signatureConfigs в вашем файле Gradle

signingConfigs {
        config {
            keyAlias 'appalias'
            keyPassword 'hunter123'
            storePassword 'hunter123'
            storeFile file('path/to/keystore.jks')
        }
}

2. Перейдите к типам сборки в структуре проекта (в Android Studio) и укажите signatureConfigs для "config"

Теперь очистите ваш проект и постройте снова. Он должен работать.

Если вышеупомянутое не работает, то ниже ваше последнее средство.
Попробуйте первый шаг, соберите и проверьте. Если это не работает, перейдите к следующему шагу и попробуйте собрать заново.

  1. Создайте подписанный APK (с помнить пароль проверен).
  2. Перед подписанием проверьте имя файла файла хранилища ключей, которое вы даете при подписании apk (в андроид студии).
  3. Установите подписанный apk на свое устройство.
  4. Подождите пять минут.
  5. Попробуйте петь в Google. Если по-прежнему 12501, подождите еще пять минут. При этом ударил синхронизацию Gradle.
  6. Попробуйте снова. Он должен работать.

Изменить: Google добавил подпись apk в консоли. Если вы уже подписали свой apk, игнорируйте его ИЛИ, если хотите использовать его, будьте осторожны с ним, поскольку он может нарушить ваши текущие настройки входа в Google

Не знаю, насколько актуален этот вопрос в 2019 году. Однако код ошибки 12501 означает:

Вход был отменен пользователем. т.е. пользователь отменил некоторые разрешения входа, например, выбор учетной записи или согласие OAuth.

Проверьте следующую ссылку для получения дополнительной информации:

https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes.html

<meta-data> из Androidmanifest.xml находится вне <application></application> корпус. Вот почему вы получаете ошибку 12501

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    <meta-data android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

У меня такая же проблема. Проблема заключалась в том, что я каким-то образом выбрал неправильный "API Project" и поэтому выбрал неправильный ключ веб-клиента. Очевидно, что в обоих моих проектах API были созданы два идентификатора клиента сервера OAuth2, пока я пытался запустить демонстрационное приложение.

вид конфигурации

Вы уже настроили свой signingConfigs а также buildTypes в вашем Gradle? Я исправил это, явно указав эти вещи на Gradle. Читайте здесь http://developer.android.com/tools/publishing/app-signing.html

Привет, я уже видел комментарии выше, но, как я уже делал практично, проблема с ша-ха означает, что если вы зарегистрируете ша определенного ip-адреса и получите google.services json, то это прекрасно, если вы можете использовать

   gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

или gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(LoginActivity.this.getResources().getString(R.string.server_client_id)) .requestEmail().build(); но если вы хотите создать приложение на другом ip-адресе с другой машиной, sha показывает вам код ошибки 12501, поэтому вам нужно сгенерировать снова sha для этой конкретной машины. Спасибо

Я столкнулся с подобной проблемой. В моем случае это было из-за того, что идентификатор клиента сервера, который я использовал, был из другого проекта, чем ключи клиента. Оказывается, они должны быть из одного проекта.

У меня была эта ошибка, потому что у меня есть 2 приложения в 1 базе данных Firebase, и я добавил отпечатки пальцев sha в свое основное приложение, а не в приложение служб, которое я пытался обновить.

Другие вопросы по тегам