2017-03-08 216 views
3

我想開發與渠道實時聊天,這些都是我的需求:實時聊天

  • PHP後臺管理網站
  • Redis作爲會話和數據主存儲器
  • 發佈/訂閱將郵件僅發送給頻道的感興趣用戶
  • 一個WebSocket連接,用於發送和接收郵件。
  • (可選)要的NodeJS使用大NPM包,比如時間同步或socket.io

我看到兩種不同的架構來實現這一目標:

  • 與Socket.io

    socket.io

  • 與Crossbar.io

    crossbar.io

這是我的問題:

  1. 哪個架構,我應該選擇?爲什麼?
  2. 關鍵是無法從客戶端獲取用戶標識,因爲它可能格式錯誤。因此,在第一個體系結構中,我認爲每個套接字消息都應該附加來自cookie的PHPSESSID值,並在服務器端從Redis檢索PHP會話。我是對還是有更好的方式來獲取用戶ID?
  3. 我不知道在第二個架構中獲取用戶ID是否可以以不同方式完成?

編輯:

我選用Crossbar.io,因爲它是非常強大的,允許實時溝通很多不同語言的應用程序。經過學習的例子,我想出了這個:

  • 在每個登錄用戶已經在數據庫中生成密鑰。

  • PHP客戶端(高速公路)連接到服務器交叉開關和註冊自定義WAMP-CRA認證

  • 用戶的瀏覽器連接到服務器交叉開關和受到挑戰。 Secret和auth_id(用戶標識)從頁面加載時從DB加載,因此它可以完成挑戰併發送響應。

  • PHP認證者在DB中爲用戶搜索,提供的密碼和ID等於auth_id。如果有,則它會成功驗證 會話。現在我們可以相信auth_id是真正的用戶ID。

這是我的問題:

  1. 如何,我可以得到AUTH_ID上訂閱?

  2. 我還添加了cookie認證,並在認證後記住瀏覽器。但是當我在Chrome DevTools中查看時,本地存儲中有任何cookie或值。即使清除緩存後,我的瀏覽器仍然記得Crossbar。我想知道它有可能嗎?

EDIT2:

也許我被誤解,但主要問題是選擇合適的架構和獲得信任的用戶ID。沒有注意到,所以我頒發獎金,之後我被低估了。我讀了很多實時應用程序,最後決定使用Crossbar.io,所以我編輯了與它相關的問題。然後人們開始投票,提出另一個架構,但沒有真正回答我的問題。畢竟我設法自己做,並提出了我的答案。

+0

你是什麼意思「PHP後端來管理網站」?我認爲您的聊天HTML界面並不需要由PHP後端提供服務。然後它變得更輕,您可以使用nodejs或RatchetPHP後端提供聊天服務器,以及HTML + js + autobahnjs前端。 – Alcalyn

+0

@Aalyn聊天只是網站的一小部分,我想從我的PHP框架管理用戶,消息和其他東西。 –

+0

有太多可能的答案,或者對於這種格式來說,好的答案太長。請添加詳細信息以縮小答案集或隔離可以用幾個段落回答的問題。我建議你找一個開發論壇(也許[Quora](http://www.quora.com/Computer-Programming?))來解決一般問題。然後,如果您有特定的編碼問題,請回到Stack Overflow,我們很樂意提供幫助。 –

回答

0

關於獲取用戶ID:

我看到的每個實時聊天示例都是從客戶端獲取id。這是不安全的,因爲客戶端很容易就可以操縱它,所以我需要找到另一種方法。在閱讀WAMP specs後,我終於明白,我不僅要在應用中驗證用戶身份,還要在Crossbar.io。我選用動態WAMP-CRA方法和如下實施:

  • PHP應用程序連接到交叉開關服務器和註冊自定義認證者(類似於example
  • 在應用程序的用戶登錄產生有祕密密鑰爲後他並保存在數據庫中。註銷後,密鑰被銷燬。
  • 工作流程:

    1. 每一個加載的頁面包含用戶ID祕密從數據庫加載關鍵

      <script> 
          auth_id = '<?php echo $user->id ?>'; 
          secret_key = '<?php echo $user->secret_key ?>'; 
      </script> 
      
    2. 用戶瀏覽器連接到Crossbar.io服務器並得到響應與來自定製認證者的挑戰。
    3. 它使用關鍵計算簽名,並與一起發送AUTH_IDCrossbar.io服務器
    4. 驗證器從DB 祕密得到的服務提供AUTH_ID和計算簽名。然後比較簽名,如果它們相等,則驗證成功。
    5. 現在auth_id包含用戶ID,我們可以信任它的值。現在你可以參考'我如何獲得auth_id訂閱?'

答案:

我怎樣才能AUTH_ID上訂閱?

默認情況下,發佈者和訂戶沒有關於對方的任何知識,但documentation顯示有選項通過配置呼叫方身份的披露,以改變它。然後你可以從回調的細節得到AUTH_ID:

  • PHP:

    $onEvent = function ($args, $argsKw, $details, $publicationId) use ($session) { 
        $auth_id = $details->publisher_authid; 
        ... 
    } 
    $session->register('com.example.event', $onEvent); 
    
  • JS:

    function on_event(args, kwargs, details) { 
        auth_id = details['publisher_authid']; 
        ... 
    } 
    session.subscribe('com.example.event', on_event); 
    

我還添加了Cookie身份驗證和瀏覽器在認證後會被記住。但是,當我查看Chrome DevTools時,本地存儲中有任何cookie或值。即使在清除緩存後,我的瀏覽器仍然被Crossbar記住。我想知道它有可能嗎?

首先,清除緩存和硬重新加載不會刪除cookie。當我問這個問題時,有任何cookie提交,但今天我可以看到cbtidcookies 兩天前有Chrome更新,所以也許這是由於以前的版本中的錯誤。

0

PHP Ratchet是我用於通過WebSockets進行實時通信的最佳實現之一。它基於ZMQ套接字,用於幾個在線遊戲應用程序和聊天應用程序。

下面的例子將讓你開始非常迅速,會回答圍繞AUTH_ID您的問題和訂閱:

http://socketo.me/docs/hello-world

http://socketo.me/docs/push

的體系結構概述:

http://socketo.me/docs/push#networkarchitecture

我會建議創建個人每個會話中的個人連接(技巧),因爲它不會影響性能,並會爲每次聊天增加一層額外的安全性。

+0

您提供的示例基於form/ajax提交,所以這不符合我的需要:「*一個WebSocket連接將用於發送消息收到*」。 –

1

我深深地照亮了美國國家航空和宇宙航行局每秒用來轉發卡車數據的Streamer。這是最可靠的實時消息傳遞服務器。 電源網頁,手機,平板電腦,桌面和物聯網應用程序。

爲網頁和移動設備優化數據流。 Lightstreamer支持多種形式的實時消息。它足夠靈活,可用於任何場景,包括關鍵任務應用。 ►實時數據推送和網絡套接字 ►應用內廣告消息和推送通知與扇出廣播和一到一個消息 ►防火牆和代理友好 ►自適應帶寬限制 ►發佈 - 訂閱

至於你的第一個問題要獲得auth_id訂閱,只監視連接訂閱,然後在連接成功後存儲層。 不建議使用cookie,使用jwt.JSON Web Tokens是一種開放的行業標準RFC 7519方法,用於在兩方之間安全地聲明索賠。身份驗證是每個應用程序的重要組成部分之一。安全總是在不斷變化和發展.JWT可以幫助你解決這個問題。因爲它是無狀態的。

+0

如果你在選擇建築之前想到了帶有JWT的LighStreamer,我會接受你的答案。但是,在我的問題與Crossbar.io有關之後,你會這樣做。 –