TornadoWebSocketを使用する小さなアプリを書いています。認証にCookieを使用しているので、Webソケットを確立するときにこれを確認したいと思います。
したがって、ここに課題があります(公式のWebSocketの例に基づいて構築):
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
WebSocketのハンドシェイク中に「認証またはキャンセル」することも可能ですか?これは私のコードに問題がありますか、それともTornadoに問題/欠落している機能がありますか?Tornadoは、この状況でクライアント側でonerrorハンドラーをトリガーするためにWebSocketを介してエラー条件を送信できますか(マニュアルでエラー条件を強制する方法を見つけることができません)?
私が達成しようとしている一連のイベントは次のとおりです。
ユーザーは通常のWebリクエストを使用してログインし、セッショントークンは安全なCookieとして保存されます
ユーザーがWebSocketを使用するページをロードすると、javascriptがソケットを確立しようとします
ソケットが確立される前に、有効なセッショントークンの存在を確認したい
- 有効なトークンの場合、ソケットが確立され、アプリは意図したとおりに機能します
- トークンが無効な場合、ソケットはなく、ユーザーはエラーを受け取ります(または、サーバーによってWebSocketエラー状態が発生します)