2010-04-23 264 views
28

當使用websocket連接時,對用戶進行身份驗證的可能方式是什麼?WebSocket身份驗證

示例場景:通過加密的websocket連接基於Web的多用戶聊天應用程序。如何確保(或保證)此應用程序中的每個連接都屬於某個經過身份驗證的用戶,並且在連接期間「不能」被虛假用戶模擬利用。

回答

3

SSL/TLS可用於使用X.509證書對客戶端和服務器進行身份驗證。這取決於您正在使用的Web應用程序平臺。在Apache中,SSL_CLIENT_CERT environment variable可以根據已知證書列表的有效性進行檢查。這不需要使用完整的PKI,也不需要您爲每個客戶購買證書。雖然我建議使用CA來備份您的服務器的SSL證書。

+0

您的意思是SSL證書將分別用於HTTP和WebSocket連接? – yojimbo87 2010-04-23 20:00:27

+0

我不同意這麼說。 SSL/TLS可以確保傳輸層中的數據不會發生變化。但是這裏的問題是我們如何知道web套接字請求來自用戶A而不是用戶B?圖像用戶A和B都登錄。由於web-socket在連接建立後不發送cookie。所以在以後,這個web-socked如何確保請求來自真實用戶A而不是用戶B? – 2016-09-29 06:19:49

41

如果您已經在爲您的應用的非websocket部分進行身份驗證,只需在連接之後將第一條消息作爲第一條消息一起傳遞,並像平常一樣檢查cookie。

警告:它已經指出,當flashsockets使用以下不起作用:
如果您使用socket.io,那就更簡單了,餅乾都是通過自動連接上通過,並可以訪問如下所示:

var io = require('socket.io'); 
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie']; 
}); 
+4

你確定這總是有效嗎?例如,如果Socket.IO退回到Flash套接字上,瀏覽器Cookie將不會發送(AFAIK)。 – Thomas 2012-03-18 10:07:57

+1

@Thomas你是對的,有一個[問題提交](https://github.com/LearnBoost/socket.io/issues/101),提到你應該通過第一條消息進行身份驗證。 – 2012-06-26 16:08:57

+1

這是一種實用的方法,但它要求登錄(和cookie設置)與WebSocket來源相同的Web頁面,否則cookie(從登錄頁面設置)不會發送到WebSocket連接。 – oberstet 2013-12-11 17:27:54