Firma Digital
Disponible desde Toba 2.4
Un componente
ei\_firma
permite firmar digitalmente un documento pdf utilizando un Applet Java.
Actualmente la definición del componente utilizando el editor es muy
básica, todo el comportamiento se define en forma de código.
Applet Java
El Applet Java que se invoca en el firmado ya se encuentra compilado y publicado en la carpeta www/firmador_pdf de toba. El código fuente esta disponible en el trac de firma digital del siu. Es una adaptación del Firmador digital de la ONTI, incluyendo una refactorización visual, mejoras en la comunicación cliente-servidor y corrección de bugs.
Ver capturas con el circuito visual del applet en Firma Digital en Araucano
Funcionamiento
El firmador necesita las siguientes definiciones:
- ¿Cómo se muestra el Applet?
- ¿Cuál es el PDF a firmar?
- ¿Qué hacer con el PDF firmado?
La primer pregunta se resuelve en la etapa de configuración. Las otras dos como eventos
Configuración
En esta etapa se definen los detalles visuales del Applet firmador. También se puede aprovechar para generar el PDF en sí y guardarlo en sesión, en el sistema de archivos o en la base de datos. La razón por la cual generarlo en este paso es que la etapa de eventos se dispara desde el Applet mismo, dificultando su seguimiento y debugging.
<?php
function conf__firmador(toba_ei_firma $firmador)
{
$firmador->set_motivo_firma("Ejempo de Toba");
$firmador->set_dimension("500px", "300px");
//Se genera el PDF, así cuando lo viene a pedir el 'get_pdf' ya esta generado (mas facil ver los errores aca que en el evento)
$this->generar_pdf();
}
?>
Eventos
Existen dos eventos principales que necesitan ser atrapados:
enviar_pdf: La aplicación debe enviar el contenido del PDF a firmar hacia el Applet Java. Recibe como parámetro un token autogenerado, este representa una sesión de firma válida, se puede utilizar para generar un temporal con este valor.
recibir_pdf_firmado: La aplicación recibe el PDF firmado desde el Applet en forma de archivo, puede optar por guardarlo en sistema de archivos o en una tabla en la base de datos. En caso de error lanzar una excepción.
Función javascript firmaOk: Luego de la ejecución exitosa del recibir_pdf_firmado la aplicación recibe esta callback javascript donde puede activar botones/pantallas o navegar hacia una URL especifica posterior al firmado exitoso.
<?php
/**
* Se envia el PDF sin firmar hacia el Applet
*/
function evt__firmador__enviar_pdf($token)
{
//Este metodo necesita retornar el contenido del PDF, puede ser un archivo del sistema de archivos o una columna en la base de datos
//$contenido_pdf = file_get_contents($archivo);
//$contenido_pdf = stream_get_contents($datos['columna_pdf']);
return $contenido_pdf;
}
/**
* Se recibe el PDF firmado desde el Applet
*/
function evt__firmador__recibir_pdf_firmado($path, $token)
{
$this->guardar_pdf_en_tabla($path);
}
function extender_objeto_js()
{
echo "
{$this->objeto_js}.desactivar_boton('finalizar');
function firmaOk() {
alert('LISTO! Al terminar la firma se puede atrapar la función javascript firmaOk() para habilitar algún botón por ejemplo!');
{$this->objeto_js}.activar_boton('finalizar');
}
";
}
?>
Ejemplo
Existe ejemplos con estas y más situaciones en el proyecto de Referencia, Carpeta Generales > Firma Digital.