<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Documentación de la API on PlantCare Enterprise</title>
    <link>https://plantcare.farm/es/api/</link>
    <description>Recent content in Documentación de la API on PlantCare Enterprise</description>
    <generator>Hugo</generator>
    <language>es-es</language>
    <atom:link href="https://plantcare.farm/es/api/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Seguridad y Autorización</title>
      <link>https://plantcare.farm/es/api/seguridad/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://plantcare.farm/es/api/seguridad/</guid>
      <description>&lt;p&gt;La API de PlantCare Enterprise implementa un modelo de seguridad &lt;strong&gt;Zero Trust&lt;/strong&gt;. Cada solicitud se autentica en múltiples capas para garantizar la integridad y privacidad de los datos.&lt;/p&gt;
&lt;h2 id=&#34;1-autorización-de-cliente-a-api-claves-api&#34;&gt;1. Autorización de Cliente a API (Claves API)&lt;/h2&gt;
&lt;p&gt;Los clientes se autentican con una clave permanente &lt;code&gt;pk_ent_&lt;/code&gt; proporcionada durante el registro. Esta clave es validada por el &lt;strong&gt;Google Cloud API Gateway&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;mermaid&#34;&gt;
sequenceDiagram
participant Client as Cliente
participant GW as &#34;API Gateway&#34;
participant KV as &#34;Secret Manager&#34;
participant API as &#34;Servicio Backend&#34;
Client-&gt;&gt;GW: &#34;Solicitud con Bearer pk_ent_...&#34;
GW-&gt;&gt;KV: &#34;Validar Clave y Permisos&#34;
alt &#34;Clave Válida&#34;
    GW-&gt;&gt;API: &#34;Proxy de Solicitud + Encabezados de Identidad&#34;
else &#34;Clave Inválida&#34;
    GW--&gt;&gt;Client: &#34;401 No Autorizado&#34;
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-seguridad-de-almacenamiento-escaneo-de-malware&#34;&gt;2. Seguridad de Almacenamiento (Escaneo de Malware)&lt;/h2&gt;
&lt;p&gt;Cada imagen cargada en la API Enterprise se escanea automáticamente en busca de virus y malware antes de ser procesada. Esto se gestiona mediante un &lt;strong&gt;Disparador de Cloud Storage&lt;/strong&gt; asíncrono.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>La API de PlantCare Enterprise implementa un modelo de seguridad <strong>Zero Trust</strong>. Cada solicitud se autentica en múltiples capas para garantizar la integridad y privacidad de los datos.</p>
<h2 id="1-autorización-de-cliente-a-api-claves-api">1. Autorización de Cliente a API (Claves API)</h2>
<p>Los clientes se autentican con una clave permanente <code>pk_ent_</code> proporcionada durante el registro. Esta clave es validada por el <strong>Google Cloud API Gateway</strong>.</p>
<div class="mermaid">
sequenceDiagram
participant Client as Cliente
participant GW as "API Gateway"
participant KV as "Secret Manager"
participant API as "Servicio Backend"
Client->>GW: "Solicitud con Bearer pk_ent_..."
GW->>KV: "Validar Clave y Permisos"
alt "Clave Válida"
    GW->>API: "Proxy de Solicitud + Encabezados de Identidad"
else "Clave Inválida"
    GW-->>Client: "401 No Autorizado"
end
</div>
<hr>
<h2 id="2-seguridad-de-almacenamiento-escaneo-de-malware">2. Seguridad de Almacenamiento (Escaneo de Malware)</h2>
<p>Cada imagen cargada en la API Enterprise se escanea automáticamente en busca de virus y malware antes de ser procesada. Esto se gestiona mediante un <strong>Disparador de Cloud Storage</strong> asíncrono.</p>
<div class="mermaid">
sequenceDiagram
participant GCS as "Cloud Storage"
participant Func as "Función de Escaneo"
participant Scan as "Escáner de Malware"
GCS->>Func: "Evento: Objeto Finalizado"
Func->>Scan: "Solicitud de Escaneo Autorizada OIDC"
Scan->>Scan: "Análisis de Firmas de Malware"
alt "Archivo Infectado"
    Scan-->>Func: "Estado: infectado"
    Func->>GCS: "ELIMINAR Objeto"
    Func->>Func: "Registrar Incidente de Seguridad"
else "Archivo Limpio"
    Scan-->>Func: "Estado: limpio"
end
</div>
<hr>
<h2 id="3-autorización-de-servicio-a-servicio-oidc">3. Autorización de Servicio a Servicio (OIDC)</h2>
<p>Cuando el <strong>Servicio Backend</strong> necesita llamar a servicios internos (como el Procesador de Imágenes), no utiliza un secreto compartido. En su lugar, utiliza <strong>Tokens de Identidad OIDC</strong> obtenidos del Servidor de Metadatos de Google.</p>
<div class="mermaid">
sequenceDiagram
participant API as "Servicio de Análisis"
participant Meta as "Servidor de Metadatos GCP"
participant Proc as "Procesador de Imágenes"
API->>Meta: "Obtener Token ID (Audience: URL del Procesador)"
Meta-->>API: "Token ID JWT Firmado"
API->>Proc: "POST /process (Authorization: Bearer JWT)"
Proc->>Proc: "Validar JWT con Google PubKeys"
alt "Token Válido"
    Proc-->>API: "200 OK (Imagen Procesada)"
else "Token Inválido"
    Proc-->>API: "403 Prohibido"
end
</div>
<hr>
<h2 id="3-aislamiento-de-red">3. Aislamiento de Red</h2>
<p>Para blindar aún más el sistema, el <strong>Procesador de Imágenes</strong> está configurado con <code>INGRESS_TRAFFIC_INTERNAL_ONLY</code>. Esto significa que es físicamente inalcanzable desde el internet público, incluso con un token válido. La comunicación se enruta a través de un <strong>Conector VPC Serverless</strong> privado.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Arquitectura y Escalabilidad</title>
      <link>https://plantcare.farm/es/api/arquitectura/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://plantcare.farm/es/api/arquitectura/</guid>
      <description>&lt;p&gt;La API PlantCare Enterprise se basa en una arquitectura &lt;strong&gt;Nativa de la Nube y Sin Estado&lt;/strong&gt;, diseñada para manejar cargas masivas de IoT con tiempo de inactividad cero.&lt;/p&gt;
&lt;h2 id=&#34;1-seguridad-en-el-borde-edge-y-mediciones&#34;&gt;1. Seguridad en el Borde (Edge) y Mediciones&lt;/h2&gt;
&lt;p&gt;Cada solicitud a nuestros puntos finales Enterprise es interceptada por un &lt;strong&gt;Middleware de Seguridad&lt;/strong&gt; de alto rendimiento que aplica políticas de seguridad y cuotas de uso en el borde antes de que se ejecute cualquier lógica de negocio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>La API PlantCare Enterprise se basa en una arquitectura <strong>Nativa de la Nube y Sin Estado</strong>, diseñada para manejar cargas masivas de IoT con tiempo de inactividad cero.</p>
<h2 id="1-seguridad-en-el-borde-edge-y-mediciones">1. Seguridad en el Borde (Edge) y Mediciones</h2>
<p>Cada solicitud a nuestros puntos finales Enterprise es interceptada por un <strong>Middleware de Seguridad</strong> de alto rendimiento que aplica políticas de seguridad y cuotas de uso en el borde antes de que se ejecute cualquier lógica de negocio.</p>
<div class="mermaid">
sequenceDiagram
participant Client as "Cliente"
participant Edge as "Middleware de Seguridad"
participant DB as "Almacén de Cuotas/Auditoría"
participant API as "Servicio de Análisis"
Client->>Edge: "Solicitud (con Token API)"
Edge->>Edge: "Validar Tamaño de Carga (<10MB)"
Edge->>Edge: "Verificar Formato de Token (API2)"
Edge->>DB: "Consultar Cuota y Rol (RBAC)"
alt "Cuota Excedida"
    Edge-->>Client: "429 Demasiadas Solicitudes"
else "Autorizado"
    Edge->>DB: "Registrar Pista de Auditoría"
    Edge->>API: "Reenviar Solicitud"
    API-->>Client: "Resultado del Análisis"
end
</div>
<hr>
<h2 id="2-entrega-de-webhooks-confiable">2. Entrega de Webhooks Confiable</h2>
<p>Nuestro sistema de webhooks está desacoplado del ciclo de vida de la solicitud principal mediante <strong>Google Cloud Pub/Sub</strong>. Esto garantiza que, incluso si su punto final no está disponible temporalmente, reintentaremos la entrega con un retroceso exponencial (exponential backoff).</p>
<div class="mermaid">
sequenceDiagram
participant API as "Servicio de Análisis"
participant Topic as "Tema Pub/Sub"
participant Worker as "Trabajador Webhook"
participant Hub as "URL del Cliente"
API->>Topic: "Publicar: análisis completado"
API-->>API: "HTTP 202 Aceptado"
Topic->>Worker: "Disparar: Nuevo Evento"
Worker->>Worker: "Firmar Carga (HMAC-SHA256)"
Worker->>Hub: "POST (con PlantCare-Signature)"
alt "Punto Final Caído (5xx/4xx)"
    Hub-->>Worker: "Error"
    Worker->>Worker: "Reintentar con Retroceso Exponencial"
else "Éxito (2xx)"
    Hub-->>Worker: "200 OK"
end
</div>
<hr>
<h2 id="3-escalabilidad-sin-estado">3. Escalabilidad Sin Estado</h2>
<p>El <strong>Servicio de Análisis</strong> es puramente sin estado (stateless). Esto permite que la plataforma pueda:</p>
<ul>
<li><strong>Auto-escalar</strong>: Maneje picos repentinos de tráfico generando cientos de instancias en segundos.</li>
<li><strong>Auto-sanar</strong>: Si una instancia falla, otra toma su lugar de inmediato sin perder el estado de la sesión.</li>
<li><strong>Alcance Global</strong>: Implemente código en múltiples regiones de GCP simultáneamente para un acceso de baja latencia.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
