2016-08-29 69 views
0

插槽IO認證的情況下,這是我的設置 -使用Passport與節點-Express和MongoDB的

三種運行三個不同節點的js在三個不同的EC2服務器應用不同的服務器。

服務器1 - 正在運行的主應用程序。

服務器2 - 正在運行管理員應用程序。

服務器3 - 運行服務提供商應用程序。

每個服務器都使用相同的MongoDB數據庫,因爲它們必須共享集合。

所以我有 -

服務器4 - 數據庫服務器 - 運行蒙戈DB。

在數據庫有代表三個類型的用戶三個集合 -

1]主要用戶2]管理員用戶3]服務提供商

每種類型的用戶登錄到他自己的NodeJS應用通過連接到各自的服務器使用不同的客戶應用

例如管理員用戶連接到服務器2並登錄到管理應用程序。

對於使用登錄護照,會話存儲在Mongo數據庫中,使用connect-mongo。所有類型用戶的所有會話都存儲在Mongo DB中的相同會話集合中。

的問題 -

現在我想用socket.io實行通報制度。每種類型的用戶在其模型中都有一個通知子文檔數組。事情是這樣的 -

主要用戶模式

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

管理員用戶架構

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

服務提供商架構

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

如果主用戶書特定服務提供商的服務,首先服務預訂信息將被存儲,然後通知將被放入服務器副提供者通知數組。現在,如果服務提供商在線,則應將通知推送給服務提供商客戶端應用程序。

爲此,我試圖使用Socket.io。

我的做法

設置推送新服務器的通知 -

服務器5 - 通知服務器。

該服務器運行一個socket.io服務器。當任何類型的用戶使用相應的客戶端應用程序登錄到各個節點js應用程序時,他也會在成功登錄後連接到此通知服務器。

現在,當MainUser預訂特定服務提供者的服務時,主服務器應用程序會將通知放入其文檔中的特定服務提供者通知數組中。之後,它會向通知服務器發送一個請求,以在由服務提供商的ID指定的通道上發出通知,以便如果服務提供商處於聯機狀態,他會立即在其客戶端應用程序上收到通知。

但是,如何確保連接到我的套接字io服務器的用戶是合法的。如果有任何用戶可以連接到套接字IO服務器並監聽其他用戶的頻道,如果他以某種方式獲得其他用戶的ID並獲得所有其他用戶的通知。我想要的是通知服務器應該查看MongoDB數據庫中的會話集合並檢查連接的用戶是否已通過身份驗證並具有適當的用戶標識。

回答

0

從你的文章中,我假設你使用快遞,快遞會話和socket.io

你socket.io你Express會話鏈接到你的socket.io插座可以添加中間件。

expressSessionMiddleware這裏是「快速會話」中間件的實例,它應該與主應用程序中的會話中間件完全相同地配置。

socketio = require "socket.io" 
io  = socketio() 

io.use (socket, next) -> 
    expressSessionMiddleware socket.handshake, {}, next 

然後,您將有機會獲得會議socket.handshake.session

,做這方面的例子模塊可以在這裏找到:https://github.com/xpepermint/socket.io-express-session

相關問題