我试图测试一个方案,一方面,匿名用户应该立即断开与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?这是不重要的,无用的,或为什么任何人都不能帮助这个重要的话题?

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

  1. java值传递和引用传递_辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  2. 计算机向用户传递计算 处理结果的设备,计算机向用户传递计算、处理结果的设备是()...

    摘要: 通过资料查阅有关文献,计算机向计算结果息的估信取评以获方法是_.自行车B.客,传递处理某一行人指在过道交通单位点或断面的()的内通一地量是路某时间数量,行人货车客.计算机向计算结果标题写可下( ...

  3. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

  4. 什么是 cookie? 会话 cookie 与持久性 cookie 之间 有何区别?

    转载: https://www.cisco.com/c/en/us/products/collateral/security/web-security-appliance/cn/117925-tech ...

  5. 【小白入门】Socket和webSocket入门 这一篇就够了!用php的Socket自己实现简单webSocket服务器!

     这几天研究了下php实现webSocket的方法,网上查了不少博文,涉及到的知识点不少.但却非常值得学,因为这方面典型的应用场景非常的多,消息推送,聊天室,所有需要长连接的地方都会用到它.     ...

  6. HTML用cookie实现自动登录,用cookie实现websocket自动登录,session状态保留。

    原标题:用cookie实现websocket自动登录,session状态保留. 会话状态的保留,即登录状态保持,是很常见.很常用的功能. 本文将介绍,在NodeJS开发中,如何实现websocket连 ...

  7. websocket 客户端测试工具

    一个简单的 websocket 客户端测试工具(html页面) 基于自定义的 websocket 协议,后端服务是一个基于Netty的websocket Server <!DOCTYPE htm ...

  8. 告别手动输入验证码!Web自动化测试带你解锁验证码处理和Cookie机制,跨越测试瓶颈!

    Web自动化之验证码处理及cookie机制 在Web自动化测试中,验证码的处理一直是一个难点.如果没有自动化处理方式,手动输入验证码将会非常耗时且容易出错.本文将为大家介绍如何通过Python实现验证 ...

  9. 自制小工具-在线webSocket连接测试工具

    使用场景 最近在进行websocket开发的时候,没有找到一个趁手的在线WS和WSS连接测试工具,这使我十分的苦恼,所以特此开发一个简单的小工具,特此在这分享给大家. 工具地址 webSocket工具 ...

最新文章

  1. socket编程:多路复用I/O服务端客户端之poll
  2. 设计模式----组合模式UML和实现代码
  3. Tfs 2010使用小技巧
  4. 简明机器学习教程——实践篇(一):从感知机入手
  5. 新趋势:数据驱动的销售
  6. 使用 ref 对已渲染到页面的节点进行标记
  7. 老板想okr,员工想kpi
  8. idea报“Usage of API documented as @since 1.7”这一问题的解决方法
  9. 苹果机的时间格式转换为时间搓
  10. 中文乱码翻译器在线翻译_如何将芬兰语翻译成中文?这两种方法你得会
  11. cocos2d 帧序列动画
  12. EDA技术实用教程 | 复习十四 | Quartus II工具的使用
  13. 基于MemFireCloud的电子图书馆开发指南(三)
  14. python柱形图绘制_Python绘图之柱形图绘制详解
  15. 深度学习图片分类增强数据集的方法汇总
  16. IIS 配置网站出现500内部服务器错误,显示具体错误信息
  17. 插上网线进入转发状态需要等30s,是什么问题?-网络热门问题分析
  18. 领导管理团队的3个正确方法
  19. AI制药 - PDB序列与标准序列的差异
  20. 人生思考--碌碌无为的一天

热门文章

  1. TypeScript Parameter Destructuring 语法 - 参数解构
  2. Angular 项目 tsconfig.json 里定义的 out-tsc 还有作用吗?
  3. 关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案
  4. Organization model change - product line item EC
  5. What does SAP UI5 bindItem occurs
  6. Fiori 里周期性检查window size大小的变化
  7. smart filter无法从smart business应用获得值的问题分析
  8. Fiori里花瓣的动画效果实现原理
  9. ABAP enablement in Sublime Text
  10. SAP Fiori Launchpad上的错误消息 - User Parameter /UI2/WD_TRKORR_CUST is not maintained