Ошибка 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 в моей консоли разработчика предназначен для веб-приложения: А также 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"
Теперь очистите ваш проект и постройте снова. Он должен работать.
Если вышеупомянутое не работает, то ниже ваше последнее средство.
Попробуйте первый шаг, соберите и проверьте. Если это не работает, перейдите к следующему шагу и попробуйте собрать заново.
- Создайте подписанный APK (с помнить пароль проверен).
- Перед подписанием проверьте имя файла файла хранилища ключей, которое вы даете при подписании apk (в андроид студии).
- Установите подписанный apk на свое устройство.
- Подождите пять минут.
- Попробуйте петь в Google. Если по-прежнему 12501, подождите еще пять минут. При этом ударил синхронизацию Gradle.
- Попробуйте снова. Он должен работать.
Изменить: Google добавил подпись apk в консоли. Если вы уже подписали свой apk, игнорируйте его ИЛИ, если хотите использовать его, будьте осторожны с ним, поскольку он может нарушить ваши текущие настройки входа в Google
Не знаю, насколько актуален этот вопрос в 2019 году. Однако код ошибки 12501 означает:
Вход был отменен пользователем. т.е. пользователь отменил некоторые разрешения входа, например, выбор учетной записи или согласие OAuth.
Проверьте следующую ссылку для получения дополнительной информации:
<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 в свое основное приложение, а не в приложение служб, которое я пытался обновить.