Configuración de Android & Verificación de Servidor
Copie una línea de comando de configuración con los pasos de instalación y la guía de markdown completa para este plugin.
Sistema nativo de Android utilizado
Sección titulada “Sistema nativo de Android utilizado”En Android, este plugin utiliza Estándar de integridad de Google Play API:
prepareIntegrityTokenduranteprepare()requestStandardIntegrityTokenparacreateAttestation()ycreateAssertion()
Requisitos
Sección titulada “Requisitos”- 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
Configuración de Google
Sección titulada “Configuración de Google”- Habilitar Integridad de Play API en tu proyecto de Google Cloud.
- Abre la consola de Play y configura el acceso de Integridad de Play para tu aplicación.
- Proporciona
cloudProjectNumberal plugin.
Capacitor config
Sección titulada “Capacitor config”plugins: { AppAttest: { cloudProjectNumber: '123456789012', },}También puedes pasar cloudProjectNumber por llamada en opciones de método.
Flujo del cliente
Sección titulada “Flujo del cliente”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.
Flujo de trabajo de backend (Android)
Sección titulada “Flujo de trabajo de backend (Android)”Registro (createAttestation)
Sección titulada “Registro (createAttestation)”- El backend crea uno de uso único
challenge. - App llamadas
createAttestation({ keyId, challenge }). - Backend llamadas a Google
decodeIntegrityTokenAPI. - Backend verifica al menos:
requestDetails.requestHash === base64url(SHA256(challenge))appIntegrity.packageNamees igual a su identificador de aplicación AndroidappIntegrity.certificateSha256Digestcontiene el digest de certificado de firma de lanzamiento- los veredictos de integridad coinciden con su política de seguridad
Protección de solicitudes (createAssertion)
Sección titulada “Protección de solicitudes (createAssertion)”- Backend crea una solicitud temporal
payload. - App llamadas
createAssertion({ keyId, payload }). - Backend descodifica el token y verifica
requestHash === base64url(SHA256(payload)). - Prevenir la reproducción (útilidad única + TTL) y política de veredicto de integridad.
Esquema de Android
Sección titulada “Esquema de Android”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 policyContrato de pago de backend mínimo
Sección titulada “Contrato de pago de backend mínimo”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"}