2015-07-05 84 views
7

我想基於由Laravel創建的客戶端的會話數據socket.io端進行身份驗證。Laravel 5:使用Laravel會話數據Socket.io客戶端身份驗證

我所想的是:

A - 發光的用戶名和電子郵件從客戶端到服務器;

乙 - 存儲在Redis的PHP用戶登錄後在我socket.io服務器需要的數據,然後基於會話cookie ID閱讀它的Node.js。 如果我更喜歡這種方法,我可能需要在Redis中存儲sessionId -> "email, name"

Ç - 使用Redis的會話駕駛員Laravel,解碼由Laravel設置cookie,訪問來自Node.js的,反序列化Laravel會話值和解碼它們;

方法A顯然非常不安全,只能用於證明概念。

方法C似乎更好,因爲我不必複製或管理會話數據,但只能解碼它。然而,這種方式將我的應用程序與Laravel管理會話的實現細節結合起來,因此似乎不合適。

方法B看起來更有希望,實現更簡單。 但是使用方法B意味着我必須自己管理一些會話數據,以便socket.io能夠讀取它。這樣做可能會使我在Redis中存儲的Laravel會話數據和會話數據相互不一致,並且這會在某個時間點發生。例如,在某些極端情況下,可能會重用過期的會話標識,並且某些socket.io客戶端將被錯誤地認證爲另一個用戶。我現在無法想到更微不足道的情況,但是由於這種趨勢,我認爲有可能存在這種情況,安全性和用戶體驗都會受到影響。

什麼是更優雅,穩健和安全的方式來實現socket.io應用基於Laravel會話數據的用戶認證?如果沒有更好的方法,我認爲方法B是最好的,我可以做些什麼來提高會話數據之間的一致性,我使用Redis和Laravel會話數據進行管理。

就我可以總結而言,整點實際上是訪問Laravel和php之外的Laravel會話數據,並通過sessionId,電子郵件和用戶名來識別客戶端。

回答

6

我建議你使用JSON Web令牌認證。

JSON網絡令牌(JWT)是在空間有限的環境中,如HTTP授權報頭中使用的相對較新的令牌格式。智威湯遜被設計爲一種基於各方之間的安全請求轉移方法。 More detailed info about JWT

Laravel最簡單的方法是使用像this one這樣的軟件包。或者你可以通過你自己來實現它。

使用JWT驗證您將能夠從令牌訪問用戶。例如:

$user = JWTAuth::parseToken()->toUser(); 

有關如何使用「智威湯遜-auth的」詳細信息看看here

+2

這似乎比我想象的要好得多。我閱讀了關於智威湯遜的想法。如果你稍微擴展你的答案並解釋爲什麼JWT可以很好地用於認證socket.io客戶端(以防其他人有相同的問題),那將是非常好的。 –

+0

我剛剛添加了更多關於JWT的信息。 –

0

正如Alexandros所述,您應該使用智威湯遜。

使用socket.io驗證JWT是件輕而易舉的事情。 您可以使用socketio-authjsonwebtoken,如article中所描述的那樣,可以對您的用戶進行身份驗證。此外,您可以使用dotenv從Laravel .env文件中讀取簽名令牌的祕密密鑰。

對我來說它工作正常,儘管你必須考慮令牌的失效。在Laravel jwt-auth通過使用黑名單來照顧這一點。所以在你的節點服務器中,你必須自己處理這個問題。或保持生命力短暫。

0

大約一年前,我找到了一個很好的解決方案。我決定讓它成爲一個模塊,它非常易於使用。可以幫助你獲得cookie而不用硬編碼。可以幫助你得到會話ID和從MySQL檢索和Redis的

https://www.npmjs.com/package/node-laravel-session

這樣你可以分享你所有的會話。你也可以利用這個會話來註冊某個房間的用戶