erseco / autofirma-intermediate-server
Framework-agnostic PHP implementation of the AutoFirma intermediate server protocol
Package info
github.com/erseco/autofirma-intermediate-server
pkg:composer/erseco/autofirma-intermediate-server
Requires
- php: >=7.4
Requires (Dev)
- phpstan/phpstan: ^1.12 || ^2.1
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^3.13 || ^4.0
This package is auto-updated.
Last update: 2026-08-01 17:27:16 UTC
README
Implementación PHP, independiente de frameworks, del servidor intermedio que AutoScript utiliza para intercambiar datos entre una aplicación web y AutoFirma.
Important
Este proyecto no pertenece al Gobierno de España, no incluye AutoFirma y no realiza ni valida firmas electrónicas. Solo transporta temporalmente datos opacos que AutoScript y AutoFirma cifran y descifran.
Para qué sirve
En dispositivos móviles y en entornos donde la comunicación local mediante WebSocket no está disponible, AutoScript necesita dos servicios HTTP:
- storage: recibe temporalmente la petición o el resultado cifrado;
- retrieve: entrega el dato una sola vez y lo elimina.
Ambos servicios deben usar el mismo almacenamiento. La librería implementa el
protocolo v=1_0, sus respuestas de compatibilidad y el consumo único, pero no
impone WordPress, Symfony, Laravel ni una implementación HTTP concreta.
Instalación
composer require erseco/autofirma-intermediate-server
Uso básico
<?php declare(strict_types=1); use Erseco\AutoFirma\IntermediateServer\Clock\SystemClock; use Erseco\AutoFirma\IntermediateServer\IntermediateServer; use Erseco\AutoFirma\IntermediateServer\Protocol\Request; use Erseco\AutoFirma\IntermediateServer\Storage\FilesystemStore; require __DIR__ . '/vendor/autoload.php'; $clock = new SystemClock(); $store = new FilesystemStore('/var/lib/autofirma-intermediate', $clock); $server = new IntermediateServer($store); $body = file_get_contents('php://input'); $request = Request::fromRawHttp( $_SERVER['REQUEST_METHOD'] ?? 'GET', $_GET, $body === false ? '' : $body ); $response = $server->handle($request); http_response_code($response->statusCode()); foreach ($response->headers() as $name => $value) { header($name . ': ' . $value); } echo $response->body();
Después se pasan las dos URL públicas a
@erseco/autofirma-client:
const client = new AutoFirmaClient({ storageUrl: "https://example.org/autofirma/storage/<token>", retrieveUrl: "https://example.org/autofirma/retrieve/<token>", });
Las dos rutas pueden delegar en la misma instancia de IntermediateServer.
La separación de URL existe por compatibilidad con AutoScript.
Almacenamientos incluidos
FilesystemStore: producción en un único nodo o con un volumen compartido.MemoryStore: pruebas y procesos persistentes; no sirve para PHP-FPM porque su contenido desaparece al terminar cada petición.
Para Redis, una base de datos u otro sistema distribuido, implementa
StoreInterface. consume() debe ser atómico: ningún resultado puede
entregarse dos veces.
Seguridad
Las rutas son utilizadas tanto por el navegador como por AutoFirma y no pueden depender de una cookie de sesión. No publiques una URL fija y anónima sin una capa adicional de protección.
Como mínimo:
- usa exclusivamente HTTPS;
- incluye un token opaco y efímero en la ruta;
- limita tamaño, tasa de peticiones y tiempo de vida;
- almacena fuera de cualquier directorio público;
- desactiva la caché HTTP y evita registrar cuerpos o identificadores;
- configura un almacenamiento compartido si hay varios nodos.
Consulta docs/seguridad.md antes de desplegarla.
Desarrollo
make install make check
Los controles incluyen validación de Composer, PSR-12, PHPStan al nivel máximo, PHPUnit y auditoría de dependencias.
Documentación
Licencia
GPL-2.0-or-later. AutoFirma y AutoScript mantienen sus propias licencias y marcas.