1

我正在编写一个使用 Tornado websockets 的小应用程序。我使用 cookie 进行身份验证,因此我想在建立 Web 套接字时检查这一点。

所以这是挑战(基于官方 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"

原来这在 Tornado 中不是很流行,抛出这个错误:

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 是否能够通过 websockets 发送一些错误条件来触发客户端的 onerror 处理程序(在手册中找不到任何强制错误条件的方法)?

我试图实现的事件顺序是:

  1. 用户使用常规 Web 请求登录,会话令牌存储为安全 cookie

  2. 用户加载使用 websockets 的页面,javascript 尝试建立套接字

  3. 在建立套接字之前,我想检查是否存在有效的会话令牌

    • 如果令牌有效,则建立套接字并且我的应用程序按预期工作
    • 如果令牌无效,则没有套接字,并且用户收到错误消息(或者,服务器会引发 websocket 错误条件)
4

3 回答 3

3

您可以跟踪您的用户,您可以轻松地做到这一点,因为每个连接到服务器的用户都会创建一个实例,请查看此SO 链接

关于如果他没有通过身份验证你想关闭连接,你可以通过调用 WebSWebSocketHandler 实例中的 close() 方法来做到这一点,如下所示:

class WSHandler(tornado.websocket.WebSocketHandler):

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

在 Tornado 中检查:tornado.websocket.WebSocketHandler.WebSocketHandler.close()

我自己没试过。你可以试试,告诉我它是否适合你。

于 2013-01-01T07:04:02.433 回答
1

这是?

http://www.tornadoweb.org/documentation/web.html#tornado.web.RequestHandler.write_error

可以覆盖handle.write_error方法,不知道WebSocketHandler有没有这个方法

于 2012-11-24T13:08:39.033 回答
0

看起来这个问题的答案就像 Nikolay Fominyh 建议的那样(尽管我不能接受这个答案,因为它是评论而不是答案)向用户发送消息并关闭连接。这似乎是目前解决这个问题的最佳方法。

于 2012-12-25T21:36:14.900 回答