如何在 Tornado 中验证 WebSockets
How to Authenticate WebSockets in Tornado
是否可以在 Tornado 中验证 WebSocket 握手请求?如果是这样,如何?如果没有,在打开 WebSocket 之前,我可以在哪里检查经过身份验证的用户 ?
您的问题具体询问了在打开 websocket 连接之前进行身份验证的问题。
如果您愿意允许打开连接进行身份验证,然后在身份验证失败时关闭连接(仍然保证不发送任何数据),那么您需要在 open
套接字处理程序的方法,它检查用户是否已通过身份验证,否则拒绝初始化数据流(the WebSocketHandler source 可能在这里很有趣),关闭连接。在初始握手时调用 Open,但在方法 returns 之前不会发送任何数据。因此,您可以在侦听端点初始化之前关闭连接。
您可以使用 RequestHandler.current_user
检查经过身份验证的用户的请求:这在任何处理程序中都可用,包括 WebSocketHandler
。
您可能还在使用 authentication cookies – 您可以通过使用 self.request.headers
或 get_secure_cookie
.
在套接字处理程序中访问该 cookie
如果您选择使用 cookie,您会遇到类似情况:
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
user_slug = self.get_secure_cookie("user_cookie")
if user_slug:
...
else:
...
self.close()
...
如果出于某种重要原因从未调用 open
,您可以考虑从 WebSocketHandler
调用覆盖 get
以排除所有初始化:
class SocketHandler(tornado.websocket.WebSocketHandler):
def get(self, *args, **kwargs):
if self.get_current_user():
...
super(SocketHandler, self).get(*args, **kwargs)
else:
...
是否可以在 Tornado 中验证 WebSocket 握手请求?如果是这样,如何?如果没有,在打开 WebSocket 之前,我可以在哪里检查经过身份验证的用户 ?
您的问题具体询问了在打开 websocket 连接之前进行身份验证的问题。
如果您愿意允许打开连接进行身份验证,然后在身份验证失败时关闭连接(仍然保证不发送任何数据),那么您需要在 open
套接字处理程序的方法,它检查用户是否已通过身份验证,否则拒绝初始化数据流(the WebSocketHandler source 可能在这里很有趣),关闭连接。在初始握手时调用 Open,但在方法 returns 之前不会发送任何数据。因此,您可以在侦听端点初始化之前关闭连接。
您可以使用 RequestHandler.current_user
检查经过身份验证的用户的请求:这在任何处理程序中都可用,包括 WebSocketHandler
。
您可能还在使用 authentication cookies – 您可以通过使用 self.request.headers
或 get_secure_cookie
.
如果您选择使用 cookie,您会遇到类似情况:
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
user_slug = self.get_secure_cookie("user_cookie")
if user_slug:
...
else:
...
self.close()
...
如果出于某种重要原因从未调用 open
,您可以考虑从 WebSocketHandler
调用覆盖 get
以排除所有初始化:
class SocketHandler(tornado.websocket.WebSocketHandler):
def get(self, *args, **kwargs):
if self.get_current_user():
...
super(SocketHandler, self).get(*args, **kwargs)
else:
...