日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2023/12/19 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?這是不重要的,無用的,或為什么任何人都不能幫助這個重要的話題?

總結

以上是生活随笔為你收集整理的php socket传递cookie,PHP Websocket在测试中验证用户(传递会话cookie)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。