Saltar al contenido

Configuración de Android & Verificación de Servidor

En Android, este plugin utiliza Estándar de integridad de Google Play API:

  • prepareIntegrityToken durante prepare()
  • requestStandardIntegrityToken para createAttestation() y createAssertion()
  • Aplicación de Android distribuida a través del ecosistema de Google Play
  • Servicios de Google Play disponibles en el dispositivo
  • Integridad de Play API habilitada para tu aplicación
  • Número de proyecto de Google Cloud configurado
  1. Habilitar Integridad de Play API en tu proyecto de Google Cloud.
  2. Abre la consola de Play y configura el acceso de Integridad de Play para tu aplicación.
  3. Proporciona cloudProjectNumber al plugin.
capacitor.config.ts
plugins: {
AppAttest: {
cloudProjectNumber: '123456789012',
},
}

También puedes pasar cloudProjectNumber por llamada en opciones de método.

import { AppAttest } from '@capgo/capacitor-app-attest';
const { keyId } = await AppAttest.prepare({
cloudProjectNumber: '123456789012',
});
const attestation = await AppAttest.createAttestation({
keyId,
challenge: 'backend-registration-challenge',
});
const assertion = await AppAttest.createAssertion({
keyId,
payload: 'backend-request-payload',
});

token es un token de integridad de Play y debe ser descodificado en el lado del servidor.

  1. El backend crea uno de uso único challenge.
  2. App llamadas createAttestation({ keyId, challenge }).
  3. Backend llamadas a Google decodeIntegrityToken API.
  4. Backend verifica al menos:
    • requestDetails.requestHash === base64url(SHA256(challenge))
    • appIntegrity.packageName es igual a su identificador de aplicación Android
    • appIntegrity.certificateSha256Digest contiene el digest de certificado de firma de lanzamiento
    • los veredictos de integridad coinciden con su política de seguridad
  1. Backend crea una solicitud temporal payload.
  2. App llamadas createAssertion({ keyId, payload }).
  3. Backend descodifica el token y verifica requestHash === base64url(SHA256(payload)).
  4. Prevenir la reproducción (útilidad única + TTL) y política de veredicto de integridad.
sequenceDiagram
participant App as Android App
participant Plugin as AppAttest plugin
participant PlaySDK as Play Integrity SDK
participant BE as Backend
participant Google as decodeIntegrityToken API
App->>Plugin: prepare(cloudProjectNumber)
Plugin->>PlaySDK: prepareIntegrityToken()
PlaySDK-->>Plugin: provider handle (keyId)
BE->>App: one-time challenge
App->>Plugin: createAttestation(keyId, challenge)
Plugin->>PlaySDK: requestStandardIntegrityToken(requestHash)
PlaySDK-->>Plugin: integrity token
Plugin-->>App: token + platform + format + keyId
App->>BE: token + challenge + keyId
BE->>Google: decodeIntegrityToken(token)
Google-->>BE: decoded payload
BE->>BE: verify requestHash + app identity + verdicts
BE->>App: one-time payload
App->>Plugin: createAssertion(keyId, payload)
Plugin->>PlaySDK: requestStandardIntegrityToken(requestHash)
PlaySDK-->>Plugin: integrity token
App->>BE: token + payload + keyId
BE->>Google: decodeIntegrityToken(token)
Google-->>BE: decoded payload
BE->>BE: verify requestHash + replay policy

Registro:

{
"platform": "android",
"format": "google-play-integrity-standard",
"keyId": "string",
"challenge": "string",
"token": "string"
}

Afirmación:

{
"platform": "android",
"format": "google-play-integrity-standard",
"keyId": "string",
"payload": "string",
"token": "string"
}