En una aplicación Symfony con FOSOAuthServerBundle siempre que haces una petición a la ruta /oauth, se registra un token o más tokens en la base de datos, en la tabla access_token.
Lo que pasa es que muchos de estos registros son innecesarios, pues la aplicación ya no los utiliza. Entonces me entran ganas de limpiar los tokens expirados de la base de datos. ¿A ti no?
“El FOSOAuthServerBundle no elimina directamente las entidades AccessToken, por eso puedes acabar con múltiples entradas en tu tabla de la entidad AccessToken.”
¿Cómo limpiar los tokens expirados de la base de datos con FOSOAuthServerBundle?
He encontrado en la red un artículo de Carlos Delgado en ourcodeworld.com en que nos explican algunas formas de hacerlo.
Existen por lo menos dos formas de limpiar los tokens de la base de datos. Una es ejecutando el Command que viene con el Bundle, otra es copiar la misma lógica y ejecutarla desde un controlador, o desde un servicio.
¿Cómo hacerlo con el command? (Command)
El bundle FOSOAuthServer tiene implementado un comando que hará todo el trabajo sucio por ti. Solo tienes que ejecutar la siguiente instrucción, según tu versión de Symfony:
$ php app/console fos:oauth-server:clean
o
$ php bin/console fos:oauth-server:clean
Si el resultado es algo parecido a lo siguiente, entonces ha ido todo bien:
$ php bin/console fos:oauth-server:clean
Removed 535 items from Access token storage.
Removed 668 items from Refresh token storage.
Removed 0 items from Auth code storage.
¿Cómo hacerlo desde el controlador? (Controller)
También puedes limpiar todos los tokens expirados desde un Controlador de Symfony o desde un Servicio. Una vez tengas el servicio, puedes acceder al método deleteExpired y limpiarlos. El siguiente código sería un ejemplo de Controller:
<?php
namespace myapp\myBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class MiController extends Controller
{
public function limpiartokensAction(){
/*
El control de accesos va aquí.
*/
$services = array(
'fos_oauth_server.access_token_manager' => 'Access token',
'fos_oauth_server.refresh_token_manager' => 'Refresh token',
'fos_oauth_server.auth_code_manager' => 'Auth code',
);
$info = array();
foreach ($services as $service => $name) {
/** @var $instance TokenManagerInterface */
// ¿No estás en el controlador? Necesitas inyectar el contenidor y después usar el método get. Algo como $this->container->get($service);
$instance = $this->get($service);
if ($instance instanceof TokenManagerInterface || $instance instanceof AuthCodeManagerInterface) {
$result = $instance->deleteExpired();
// … haz lo que quieras con $result;
}
}
//...
}
}
Conclusión
Concluyendo, es muy probable que no tengas ganas de ejecutar la limpieza de tokens expirados manualmente, o tu base de datos pertenece a un entorno mayor y más importante. Entonces, siempre puedes añadir la instrucción a tu Crontab y, de esta forma, hacer que el cron lo ejecute cada noche a las 22. Por ejemplo:
$ crontab -e
#Limpiar tokens caducados
00 22 * * * php /camino/hasta/el/symfony/app/console fos:oauth-server:clean > /dev/null
Si todo va bien,¡perfecto! Si no, ¿lo comentamos?
Fuentes: