Службы Google Play возвращают токен, подписанный с помощью ключа, отличного от Google.
У меня есть Android-клиент, который получает токен аутентификации от Google Play Services, используя GoogleAuthUtil.getToken(Context context, Account account, String scope)
.
Затем он отправляется на внутренний сервер (Go), который проверяет, что токен был подписан одним из сертификатов подписи Google с https://www.googleapis.com/oauth2/v1/cert. Для этого необходимо найти сертификат, присвоенный "ребенку" в заголовке токена.
В 99% случаев это работает просто отлично, но у меня бывают ситуации, когда указанный "ребенок" не соответствует ни одному из опубликованных сертификатов Google, и поэтому я не могу авторизовать токен.
Редактировать:
Я добавил обширную регистрацию на сервере, чтобы попытаться отследить это, и есть некоторые отношения, на которые стоит обратить внимание:
- Любой данный недопустимый
kid
используется только для одного пользователя. Я часто вижу несколько запросов в течение нескольких дней от одного и того же пользователя с данным недействительным kid
, но только когда-либо от этого пользователя. - Пользователь, предоставляющий недействительного
kid
никогда не использует действительного kid
для какого-либо запроса или любого другого kid
для запроса, даже если они разлучены. Afaik Google проверяет свои сертификаты каждые 24 часа или около того. - Многие пользователи используют более старые версии клиентов. Большинство пользователей обновляют в течение одного или двух дней после выпуска новой версии, но большинство пользователей с недействительными ключами сертификата используют версии, которым несколько недель.
- Запросы поступают из разных стран мира в соответствии с нашей базой пользователей.
- Запросы поступают с разных времен в соответствии с нашей базой пользователей.
- Запросы поступают от ряда устройств, производителей и моделей.
В настоящее время я думаю, что это, вероятно, от пользователей, которые скачали APK с сайта, отличного от Google Play, но у меня нет возможности проверить это прямо сейчас.
Изменение: для этого есть средство отслеживания проблем, но, похоже, он был отмечен как низкий приоритет. Если у кого-то есть такая проблема, пожалуйста, сообщите об этом на трекере. https://issuetracker.google.com/issues/37734997
Ответы
Ответ 1
Немного поздно, но для тех, кто испытывает то же самое, я бы посоветовал проверить Installer
вашего приложения.
Использование PackageManager.getInstallerPackageName()
getInstallerPackageName (String packageName) Получите имя пакета приложения, которое установило пакет. Это определяет, с какого рынка пришла посылка
Если значение равно "com.android.vending", то приложение было установлено из магазина Play Store, в противном случае обработайте других поставщиков.