Blog


Sistema de refresco de tokens JWT en Symfony

SISTEMA DE REFRESCO DE TOKENS JWT EN SYMFONY

20 / 02 / 2023 Symfony

En un artículo anterior mostrábamos una forma de implementar una autenticación JWT en un proyecto desarrollado con Symfony. Tal y comentábamos al final del mismo, es necesario añadir a la autenticación más medidas de seguridad, como puede ser un sistema de refresco de tokens.

Un sistema de refresco de tokens es un mecanismo que permite renovar un token JWT antes de que expire. Esto es útil para evitar que los usuarios tengan que volver a iniciar sesión cada vez que el token expira.

Para implementar un sistema de refresco de tokens en nuestro proyecto, podemos seguir los siguientes pasos:

  1. Crear una nueva ruta para renovar el token. Por ejemplo, podemos crear una ruta llamada /refresh que maneje la renovación del token.
  2. Crear un controlador para manejar la renovación del token. En este controlador, podemos validar el token actual, generar un nuevo token con una nueva fecha de expiración y devolverlo al cliente.
  3. Modificar nuestra lógica de autenticación para que permita el acceso a la ruta de renovación del token aunque el token actual haya expirado.
  4. Modificar nuestra lógica de autenticación para que permita el acceso a las rutas protegidas con el nuevo token generado.
class RefreshTokenController extends AbstractController
{
    private $jwtEncoder;
    private $jwtAuthService;

    public function __construct(JWTEncoderInterface $jwtEncoder, JwtAuthService $jwtAuthService)
    {
        $this->jwtEncoder = $jwtEncoder;
        $this->jwtAuthService = $jwtAuthService;
    }

    public function refresh(Request $request)
    {
        $token = $request->headers->get('Authorization');

        try {
            $this->jwtAuthService->getUserFromToken($token);
        } catch (\InvalidArgumentException $e) {
            return new JsonResponse(['error' => $e->getMessage()], 401);
        }

        $newToken = $this->jwtAuthService->refreshToken($token);

        return new JsonResponse(['token' => $newToken]);
    }
}

En este ejemplo, estamos creando un controlador para manejar la renovación del token. En primer lugar, estamos obteniendo el token actual enviado en las cabeceras de la petición, luego utilizamos nuestro servicio de autenticación para validar el token y obtener el usuario asociado, si el token es válido, generamos un nuevo token con una nueva fecha de expiración y se lo devolvemos al cliente.

Por último, debemos tener en cuenta que es importante utilizar una estrategia adecuada para guardar los tokens en el cliente y evitar que sean interceptados.

 



ARTÍCULOS RELACIONADOS