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