Службы 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, и поэтому я не могу авторизовать токен.

Редактировать:

Я добавил обширную регистрацию на сервере, чтобы попытаться отследить это, и есть некоторые отношения, на которые стоит обратить внимание:

  1. Любой данный недопустимый kid используется только для одного пользователя. Я часто вижу несколько запросов в течение нескольких дней от одного и того же пользователя с данным недействительным kid, но только когда-либо от этого пользователя.
  2. Пользователь, предоставляющий недействительного kid никогда не использует действительного kid для какого-либо запроса или любого другого kid для запроса, даже если они разлучены. Afaik Google проверяет свои сертификаты каждые 24 часа или около того.
  3. Многие пользователи используют более старые версии клиентов. Большинство пользователей обновляют в течение одного или двух дней после выпуска новой версии, но большинство пользователей с недействительными ключами сертификата используют версии, которым несколько недель.
  4. Запросы поступают из разных стран мира в соответствии с нашей базой пользователей.
  5. Запросы поступают с разных времен в соответствии с нашей базой пользователей.
  6. Запросы поступают от ряда устройств, производителей и моделей.

В настоящее время я думаю, что это, вероятно, от пользователей, которые скачали APK с сайта, отличного от Google Play, но у меня нет возможности проверить это прямо сейчас.

Изменение: для этого есть средство отслеживания проблем, но, похоже, он был отмечен как низкий приоритет. Если у кого-то есть такая проблема, пожалуйста, сообщите об этом на трекере. https://issuetracker.google.com/issues/37734997

Ответы

Ответ 1

Немного поздно, но для тех, кто испытывает то же самое, я бы посоветовал проверить Installer вашего приложения.

Использование PackageManager.getInstallerPackageName()

getInstallerPackageName (String packageName) Получите имя пакета приложения, которое установило пакет. Это определяет, с какого рынка пришла посылка

Если значение равно "com.android.vending", то приложение было установлено из магазина Play Store, в противном случае обработайте других поставщиков.