miércoles, 25 de junio de 2025

Implementando Fichas de Trabajo (Job Tickets) Seguras con JWT en PHP

Implementando Fichas de Trabajo (Job Tickets) Seguras con JWT en PHP

En aplicaciones que involucran colas de trabajo (job queues), a menudo necesitamos una forma segura y verificable de delegar la ejecución de tareas a workers. Una solución robusta es el uso de Fichas de Trabajo (Job Tickets) firmadas con JSON Web Tokens (JWT). Este método permite verificar la autenticidad e integridad de la tarea antes de ejecutarla, previniendo la manipulación maliciosa de los trabajos en cola.


secretKey = $secretKey;
    }

    public function generateTicket(array $payload, int $expirationTime = 3600): string { // Por defecto, expira en 1 hora

        $now = time();
        $payload['iss'] = 'JobTicketIssuer'; // Emisor del ticket
        $payload['aud'] = 'JobWorker'; // Audiencia del ticket
        $payload['iat'] = $now; // Emitido en
        $payload['nbf'] = $now; // No válido antes de
        $payload['exp'] = $now + $expirationTime; // Expiración

        return JWT::encode($payload, $this->secretKey, 'HS256');
    }

    public function verifyTicket(string $jwt): array|false {
        try {
            $decoded = JWT::decode($jwt, new Key($this->secretKey, 'HS256'));
            return (array) $decoded; // Devuelve el payload decodificado como un array
        } catch (\Exception $e) {
            // Loguea el error, por ejemplo: error_log("Error verifying JWT: " . $e->getMessage());
            return false; // Retorna falso en caso de error
        }
    }
}

// Ejemplo de uso:
$secretKey = 'supersecretkey'; // Cambia esto por una clave segura y aleatoria!
$generator = new JobTicketGenerator($secretKey);

$jobPayload = [
    'jobType' => 'image_resize',
    'imageId' => 123,
    'newWidth' => 800,
    'newHeight' => 600
];

$jwt = $generator->generateTicket($jobPayload);

echo "Generated JWT: " . $jwt . "\n";

// Simulación de worker verificando el ticket
$verifiedPayload = $generator->verifyTicket($jwt);

if ($verifiedPayload) {
    echo "Ticket Verified! Payload:\n";
    print_r($verifiedPayload);
    // Lógica para ejecutar el trabajo basado en el payload verificado.
} else {
    echo "Ticket Verification Failed!\n";
}
?>
    

En este ejemplo, la clase JobTicketGenerator encapsula la lógica para generar y verificar los JWTs. La función generateTicket crea un JWT con información sobre el trabajo a realizar, incluyendo su tipo, ID, y dimensiones, añadiendo además claims estándar como el emisor, audiencia, tiempo de emisión, y expiración. La función verifyTicket utiliza la librería firebase/php-jwt para verificar la firma del token y decodificar su payload. Es crucial usar una clave secreta fuerte y aleatoria, y considerar rotar las claves periódicamente por seguridad.



Para instalar la librería usar: composer require firebase/php-jwt

    

Esta implementación proporciona una base sólida para la creación de un sistema de fichas de trabajo seguro. Asegúrate de adaptar el payload del JWT a las necesidades específicas de tus trabajos, y considerar la posibilidad de agregar claims personalizados para mayor seguridad o funcionalidad. Además, la gestión de claves (key management) es crucial para la seguridad general del sistema; no almacenes la clave secreta directamente en el código.

No hay comentarios:

Publicar un comentario