php socket传递cookie,PHP Websocket在测试中验证用户(传递会话cookie)

我试图测试一个方案,一方面,匿名用户应该立即断开与Websocket连接,另一方面,认证的用户应该留在websocket连接。第一种情况很容易通过使用下面的代码来测试。认证过程不工作。

对于会话存储,我使用Cookie认证结合数据库:Symfony PDO Session Storage.它一切正常,但是当通过使用身份验证测试描述的行为,我不知道如何在测试中验证用户。作为客户端,我使用Pawl asynchronous Websocket client.这看起来如下:

\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";

});

我知道作为第三个参数,我可以传递头信息到“连接”的方法,但我找不到一个方法,使客户端连接和cookie在ws握手期间正确传递。我想到了类似:

>通过创建一个authentication token来验证客户端

>我在序列化用户的数据库中的会话表中创建一个新条目

>我将创建的cookie作为第三个参数传递给connect方法

这是我认为会工作的理论,但用户总是在websocket端保持匿名。这里的代码到目前为止的理论:

// ...

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("testuser@test.com");

$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;

}

}

作为config_test.yml,我配置会话以下方式:

session:

storage_id: session.storage.mock_file

handler_id: session.handler.pdo

对于服务器端websocket实现,我使用的是Ratchet,它被下面的Symfony包包装:Gos Websocket Bundle

如何在测试websockets时验证用户?在websocket服务器上,用户总是像“anon-15468850625756b3b424c94871115670”,但是当我手动测试时,他连接正确。

附加问题(次要):如何测试对主题的订阅? (pubsub)

在互联网上没有博客条目或任何其他内容。

更新:没有人从功能测试他们的websockets?这是不重要的,无用的,或为什么任何人都不能帮助这个重要的话题?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值