1

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を介してエラー条件を送信できますか(マニュアルでエラー条件を強制する方法を見つけることができません)?

私が達成しようとしている一連のイベントは次のとおりです。

  1. ユーザーは通常のWebリクエストを使用してログインし、セッショントークンは安全なCookieとして保存されます

  2. ユーザーがWebSocketを使用するページをロードすると、javascriptがソケットを確立しようとします

  3. ソケットが確立される前に、有効なセッショントークンの存在を確認したい

    • 有効なトークンの場合、ソケットが確立され、アプリは意図したとおりに機能します
    • トークンが無効な場合、ソケットはなく、ユーザーはエラーを受け取ります(または、サーバーによってWebSocketエラー状態が発生します)
4

3 に答える 3

3

ユーザーを追跡できます。サーバーに接続する各ユーザーがインスタンスを作成するため、簡単に追跡できます。このSOリンクを確認してください。

彼が認証されていない場合に接続を閉じたいということに関しては、次のようにWebSWebSocketHandlerインスタンス内でclose()メソッドを呼び出すことによってそれを行うことができます。

class WSHandler(tornado.websocket.WebSocketHandler):

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

トルネードでこれを確認してください: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 に答える