Servicios de reproducción de Google que devuelven un token firmado con una clave distinta de Google

Tengo un cliente de Android obteniendo un token de autenticación de Google Play Services, utilizando GoogleAuthUtil.getToken(Context context, Account account, String scope) .

Esto se envía a un servidor backend (Go), que comprueba que el token fue firmado por uno de los certificados de firma de Google de https://www.googleapis.com/oauth2/v1/cert . Para ello, debe buscar el certificado asignado al "chico" en el encabezado de token.

99% del tiempo, esto funciona muy bien, pero tengo situaciones regulares donde el "chico" dado no corresponde a ningún certificado publicado de Google, y por lo tanto no puedo autenticar el token.

Editar:

He añadido amplia registro en el servidor para tratar de rastrear esto, y hay algunas relaciones que vale la pena anotar:

  1. Cualquier kid no válido dado se utiliza solamente para un solo usuario. A menudo veo varias solicitudes durante varios días desde el mismo usuario con un determinado inválido, pero sólo desde ese usuario.
  2. Un usuario que da a un kid inválido nunca utiliza un kid válido para cualquier solicitud, o cualquier otro kid para una solicitud, incluso si son días de diferencia. Afaik Google cicla sus certificados cada 24 horas aproximadamente.
  3. Muchos usuarios utilizan versiones de cliente más antiguas. La mayoría de los usuarios se actualizan dentro de un día o dos de una versión nueva que se está publicando, pero la mayoría de los usuarios con claves de certificado no válidas utilizan versiones que tienen algunas semanas de antigüedad.
  4. Las solicitudes vienen de una propagación uniforme en todo el mundo en línea con nuestra base de usuarios.
  5. Las solicitudes vienen de una extensión de veces, en línea con nuestra base de usuarios.
  6. Las solicitudes vienen de una gama de dispositivos, fabricantes y modelos.

Mi opinión actual es que es probablemente de usuarios que han descargado el APK de un sitio distinto de Google Play, pero no tengo forma de verificarlo ahora mismo.

  • Serializar a una matriz de bytes arrojó una IOException (nunca debería suceder)
  • Esta aplicación no se ejecutará a menos que actualice el error de Google Play Services
  • ¿Todavía es necesario el permiso READ_GSERVICES para Google Maps?
  • AppStateClient loadState que recupera bytes nulos
  • DuplicateFileException m4b + servicios de juego 9.0
  • La actualización de Google Play Services de 8.4.0 a 9.2.1 provoca un error de sincronización de Gradle
  • Cómo instalar servicios de Google Play de forma automática con mi aplicación Android
  • ¿Por qué se agregan automáticamente los permisos a mi AndroidManifest cuando incluye la biblioteca de Google Play Services?
  • Import com.google.android.gms.common.api.GoogleApiClient; no se puede resolver
  • Características del juego en la vista detallada de la aplicación Play Store
  • Single Sign-On de Google Plus Cross-Platform: onConnected nunca se llama en una instalación nueva
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.