PHP Websocket autentica al usuario en una prueba (pasar cookie de sesión)

Estoy tratando de probar un escenario en el que, por un lado, los usuarios anónimos deben desconectarse inmediatamente de una conexión Websocket y, por otro lado, los usuarios autenticados deben permanecer en la conexión websocket. El primer caso es fácil de probar usando el código que se encuentra debajo. El proceso de autenticación no funciona.

Para el almacenamiento de la sesión, estoy usando la autenticación de cookies en combinación con una base de datos:Symfony PDO Session Storage. Todo funciona bien, pero cuando se trata de probar el comportamiento descrito mediante la autenticación, no sé cómo autenticar al usuario en una prueba. Como cliente, estoy usandoPawl cliente asíncrono Websocket. Esto se ve a continuación:

\Ratchet\Client\connect('ws://127.0.0.1:8080')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

Sé que, como tercer parámetro, puedo pasar la información del encabezado al método "connect", pero no puedo encontrar una manera de que el cliente esté conectado y la cookie se pase correctamente durante el protocolo de enlace ws. Pensé en algo como:

Autenticar un cliente creando untoken de autenticaciónCreo una nueva entrada en la tabla de sesión en la base de datos con el usuario serializadoPaso la cookie creada como tercer argumento al método de conexión

Esta es la teoría que pensé que funcionaría, pero el usuario siempre permanece en el anonimato en el lado del websocket. Aquí el código de la teoría hasta ahora:

// ...
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class WebsocketTest extends WebTestCase
{

    static $closed;

    protected function setUp()
    {
      self::$closed = null;
    }


    public function testWebsocketConnection()
    {
      $loop = Factory::create();
      $connector = new Connector($loop);

      // This user exists in database user tbl
      $symfClient = $this->createSession("[email protected]");

      $connector('ws://127.0.0.1:80', [], ['Origin' => 'http://127.0.0.1', 'Cookie' => 
                 $symfClient->getContainer()->get('session')->getName() . '=' 
                . $symfClient->getContainer()->get('session')->getId()])
        ->then(function(WebSocket $conn) use($loop){

            $conn->on('close', function($code = null, $reason = null) use($loop) {
                self::$closed = true;
                $loop->stop();
            });
            self::$closed = false;

        }, function(\Exception $e) use ($loop) {
            $this->fail("Websocket connection failed");
            $loop->stop();
        });

      $loop->run();

      // Check, that user stayed logged
      $this->assertFalse(self::$closed);
    }

    private function createSession($email)
    {
      $client = static::createClient();
      $container = $client->getContainer();

      $session = $container->get('session');
      $session->set('logged', true);

      $userManager = $container->get('fos_user.user_manager');
      $em = $container->get('doctrine.orm.entity_manager');
      $loginManager = $container->get('fos_user.security.login_manager');
      $firewallName = 'main';

      $user = $userManager->findUserByEmail($email);

      $loginManager->loginUser($firewallName, $user);

      // save the login token into the session and put it in a cookie
      $container->get('session')->set('_security_' . $firewallName,
        serialize($container->get('security.token_storage')->getToken()));
      $container->get('session')->save();
      $client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));


      // Create session in database
      $pdo = new PDOSessionStorage();
      $pdo->setSessId($session->getId());
      $pdo->setSessTime(time());
      $pdo->setSessData(serialize($container->get('security.token_storage')->getToken()));
      $pdo->setSessLifetime(1440);

      $em->persist($pdo);
      $em->flush();

      return $client;
  }

}

Como config_test.yml, configuré la sesión de la siguiente manera:

session:
    storage_id:     session.storage.mock_file
    handler_id:     session.handler.pdo

Para la implementación del websocket del lado del servidor, estoy usando Ratchet, que está siendo empaquetado por el siguiente paquete de Symfony:Gos Websocket Bundle

¿Cómo autenticar al usuario cuando prueba websockets? En el servidor websocket, el usuario siempre es algo así como "anon-15468850625756b3b424c94871115670", pero cuando pruebo manualmente, se conecta correctamente.

Pregunta adicional (secundaria): ¿Cómo probar la suscripción a temas? (pubsub) No hay entradas de blog ni nada más sobre esto en Internet.

Actualización: ¿Nunca nadie funcional probó sus sockets web? ¿Esto no es importante, inútil o por qué nadie puede ayudar en ese tema importante?

Respuestas a la pregunta(1)

Su respuesta a la pregunta