Cómo migrar de la API de SafetyNet Attestation

Si ya verificas las respuestas mediante un servidor de confianza, entonces te resultará sencillo realizar la migración de la API de SafetyNet Attestation a la API de Play Integrity. La API de Play Integrity también se puede usar a modo de reemplazo de las verificaciones de App Licensing que se realizan directamente con la app de Play Store a través del AIDL, como las que realiza la Biblioteca de verificación de licencias (LVL). La mayoría de los cambios necesarios estarán en el extremo del servidor de confianza, que necesita leer y analizar el token de respuesta de Play Integrity. Ten en cuenta que, durante la migración, tanto la aplicación como el servidor deben admitir ambas API de forma simultánea para que resulten compatibles con clientes más antiguos que aún no hayan realizado la actualización.

Las apps a las que se les otorgaron límites de cuota más altos para la API de SafetyNet Attestation que, a su vez, son aptas para un mayor uso de la API de Play Integrity se ubicarán automáticamente en el nivel "Elevado" a fin de cubrir su uso.

Los siguientes cambios son necesarios a los efectos de admitir la API de Play Integrity:

Cliente de Android:

  • Asegúrate de que el código pase el nonce con el formato correcto al compilador IntegrityTokenRequest:
    • String (en lugar de un array de bytes)
    • Seguro para URL
    • Codificado en Base64 y sin unión
    • Con 16 caracteres como mínimo
    • Con 500 caracteres como máximo
  • Revisa la lógica de reintentos y asegúrate de que la aplicación maneje correctamente los errores.
  • Comprueba que los datos de respuesta enviados al servidor de confianza permitan distinguir entre las respuestas de la API de SafetyNet Attestation y aquellas de la API de Play Integrity.

Servidor de confianza:

  • Revisa la lógica de generación del nonce y asegúrate de que cumpla con los requisitos de la API de Play Integrity.
  • Comprueba que el código del servidor pueda distinguir entre las respuestas de la API de SafetyNet Attestation y aquellas de la API de Play Integrity. Asegúrate de que el código analice y valide esas respuestas de forma adecuada.
  • Agrega lógica para validar y analizar las respuestas de la API de Play Integrity.
  • Dado que la nueva respuesta de la API de Play Integrity proporciona detalles adicionales, es posible que sea necesario mejorar la lógica de toma de decisiones y los datos de los comentarios que se envían a los dispositivos del cliente. Si deseas obtener más información, consulta la sección Asignación de respuestas a la API dentro de este tema.

Codificación del nonce

Un nonce relacionado con la integridad se debe pasar a la API de Play Integrity como una String codificada en Base64, segura para URL y sin unión. Este formato difiere de la API de SafetyNet Attestation, que requiere byte[].

  • Ser "Seguro para URL" significa usar la variante "segura para URL y nombres de archivo" de Base64 (consulta la sección 5 del documento RFC 4648), donde se usan "-" y "_" en lugar de "+" y "/". Si deseas obtener más información sobre la codificación en Base64, consulta el documento RFC 4648.
  • "Sin unión" significa omitir todos los terminadores de línea. Por lo tanto, el resultado constará de una sola línea larga.
.setNonce(Base64.encodeToString(NONCE_BYTES,
        Base64.URL_SAFE | Base64.NO_WRAP))

Además, asegúrate de que la generación del nonce cumpla con los lineamientos de la API de Play Integrity.

Asignación de respuestas a la API

En la siguiente tabla, se muestran los campos de la API de SafetyNet Attestation y sus equivalentes de la API de Play Integrity.

API de SafetyNet Attestation API de Play Integrity Notas
timestampMs requestDetails.timestampMillis
nonce requestDetails.nonce
apkPackageName appIntegrity.packageName
apkCertificateDigestSha256 appIntegrity.certificateSha256Digest Asegúrate de que appRecognitionVerdict esté configurado como PLAY_RECOGNIZED.
ctsProfileMatch Se integró a deviceIntegrity.deviceRecognitionVerdict
basicIntegrity Se integró a deviceIntegrity.deviceRecognitionVerdict
evaluationType Se integró a deviceIntegrity.deviceRecognitionVerdict
advice Not available
error Not available La lista de etiquetas de integridad del dispositivo estará vacía.

Asignación de veredictos de integridad del dispositivo

API de SafetyNet Attestation API de Play Integrity
ctsProfileMatch basicIntegrity evaluationType device_recognition_verdict
FALSE FALSE Empty labels
FALSE TRUE MEETS_BASIC_INTEGRITY
TRUE FALSE Empty labels
TRUE TRUE BASIC MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY
TRUE TRUE HARDWARE_BACKED MEETS_STRONG_INTEGRITY, MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY

Es posible que debas configurar el conjunto de respuestas de integridad del dispositivo si tu app usa una estrategia de aplicación compleja y necesita todos los valores posibles.

Lógica de reintentos de la API de Play Integrity

Una app debería reintentar las llamadas a la API en caso de que se muestren ciertos códigos de error. Asegúrate de haber revisado todos los códigos de error y de que la aplicación haga el reintento cuando sea necesario con retirada exponencial. Verifica que el retraso mínimo sea de al menos 5 segundos y aumente de forma exponencial (5 s, 10 s, 20 s, 40 s, etc.) a fin de brindar el tiempo suficiente a la API para evaluar la integridad del dispositivo y la aplicación.

Reemplazo opcional de la API de App Licensing

Si usas la API de App Licensing, también tienes la opción de migrar a la API de Play Integrity, ya que el token de esta API incluye información de licenciamiento de la aplicación. Al igual que con la migración de la API de SafetyNet Attestation, debes contemplar el caso en el que varios dispositivos todavía tengan una versión anterior de la aplicación. Tu servidor de confianza debe ser capaz de procesar tanto las respuestas de la API de App Licensing como las de la API de Play Integrity.