2012-11-12 28 views
1

我正在寫一個小應用程序,我使用Tornado websockets。我使用Cookie進行身份驗證,因此我想在建立Web套接字時檢查這一點。如何強制Tornado websockets在握手時產生錯誤頁面

因此,這裏的挑戰(官方的WebSockets例如建築):

class EchoWebSocket(tornado.websocket.WebSocketHandler): 
    def open(self): 
     userx = self.get_secure_cookie("user") 
     if not userx: 
      self.send_error(403) #I want to redirect or otherwise stop the user 
     print "WebSocket opened" 

    def on_message(self, message): 
     userx = self.get_secure_cookie("user") 
     self.write_message(u"%s said: %s" % (userx, message)) 

    def on_close(self): 
     print "WebSocket closed" 

事實證明,這是不是很流行的旋風,引發此錯誤:

ERROR:root:Exception in callback <tornado.stack_context._StackContextWrapper object at 0x10fa10db8> 
Traceback (most recent call last): 
.... 
    File "/Library/Python/2.7/site-packages/tornado-2.4-py2.7.egg/tornado/iostream.py", line 565, in _check_closed 
raise IOError("Stream is closed") 
IOError: Stream is closed 

它甚至可能在websockets握手期間「驗證或取消」?這是我的代碼的問題,還是與Tornado有問題/缺少功能?在這種情況下,Tornado是否能夠通過websocket發送一些錯誤條件來觸發客戶端的onerror處理程序(在手冊中找不到任何強制錯誤條件的方式)?

我想實現的事件順序是:

  1. 在使用常規的Web請求的用戶日誌和會話令牌被存儲爲安全cookie

  2. 用戶加載頁面使用websockets,javascript嘗試建立套接字

  3. 在套接字建立之前我想檢查是否存在有效會話標記

    • 如果有效令牌,套接字被建立和我的應用程序按預期工作
    • 如果無效標誌,沒有插座,用戶將收到錯誤(或者,一個WebSocket的錯誤情況是由服務器提出)
+1

在websockets握手期間甚至可以「驗證或取消」嗎? - 是的,但不是這樣。發送消息給用戶並關閉連接。 –

+0

夠公平的。應該很容易實現我的猜測。 – agnsaft

回答

3

您可以跟蹤您的用戶,您可以輕鬆地做到這一點,因爲每個用戶連接到服務器時都會創建一個實例,請檢查此SO link

class WSHandler(tornado.websocket.WebSocketHandler): 

def open(self): 
    if not condition: 
     self.close() 

入住這龍捲風:

關於要關閉連接,如果他未經過身份驗證,你可以通過調用WebSWebSocketHandler實例內部close()方法這樣做tornado.websocket.WebSocketHandler.WebSocketHandler.close()

我沒有自己嘗試。你可以嘗試一下,告訴我它是否適合你。

0

它看起來像這個問題的答案是尼古拉Fominyh暗示(雖然我不能接受的答案因爲它是一個評論而不是答案)發送消息給用戶並關閉連接。目前這似乎是解決這個問題的最好方法。

+0

我幾乎陷入了同樣的情況,但我不確定我是否會得到尼古拉所建議的答案。 請您詳細說明一下嗎? – securecurve

+0

應該發送什麼樣的消息讓我們跟蹤用戶是否在websockets中進行身份驗證? – securecurve

+0

根據我的理解,只要您的客戶端代碼可以理解並根據相應的行爲進行操作,就可以使用您想要的任何消息。雖然在此之前可以停止Websockets握手,但根據我的理解,這似乎不適用於Tornado。 – agnsaft