websocket服務器跟業(yè)務服務器分開部署 不需要登錄就能聊天 如何防止偽造身份
我的思路如下 但是不知道對不對 大家?guī)兔纯?br />
當用戶第一次訪問業(yè)務服務器的時候 根據(jù)session隨機生成一個用戶名 然后生成一個token 將用戶名跟token的關(guān)系保存到數(shù)據(jù)庫
然后把用戶名以及token發(fā)給用戶的瀏覽器 然后瀏覽器帶上用戶名以及token 訪問websocket服務器的登錄接口
websocket服務器根據(jù)用戶名去數(shù)據(jù)庫查找token 如果跟傳過來token的一致 就允許登錄然后把用戶信息保存到websocket服務器的session里面 這樣用戶以后每次發(fā)消息的時候直接讀取websocket里面的用戶名 就知道這個消息是誰發(fā)過來的
補充說明 經(jīng)過我驗證GatewayWorker不支持session 那么只能在登錄的時候綁定clientid跟用戶名的關(guān)系
下次發(fā)消息的時候根據(jù)clientid來查找出用戶名 由此來得的是誰發(fā)的消息
在次補充 上面說的有問題 希望對相關(guān)人員有幫助 測試發(fā)現(xiàn)GatewayWorker 支持session 的 但是跟傳統(tǒng)的session不一樣 例如下面的例子
if(empty($_SESSION)){
$_SESSION=123;
file_put_contents('/home/wwwroot/default/test.txt',123,FILE_APPEND);
}
每次刷新瀏覽器后都會重新生成 (傳統(tǒng)瀏覽器session刷新是不會重新生成的) 但是不刷新的這段時間內(nèi) 里面的值是一直存在的 所以可以通過他來判斷用戶是否登錄過 這個session說白了就是一個所有用戶都能訪問的全局數(shù)組
是的,GatewayWorker支持SESSION,不過是自己的一套機制,GatewayWorker手冊有詳細介紹。
如何驗證身份,我的做法是web(我用的是tp)登錄的時候,向redis存一個數(shù)據(jù),可以就是session_id,value是用戶信息。
瀏覽器連接上GatewayWorker后發(fā)送login請求(請求里包含session_id),GatewayWorker(Events.php的onMessage)收到login請求,提取session_id去redis查用戶是誰,然后利用Gateway::bind($client_id, $uid);接口綁定,設(shè)置下session,$_SESSION=xxx。