Tornado 403 Предупреждение GET при открытии websocket
Я нашел этот python script, который должен позволить мне открыть WebSocket.
Тем не менее, я получаю предупреждение [W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms
в моем Linux-терминале при попытке открыть фактический WebSocket (с помощью плагина Old WebSocket Terminal Chrome). Сообщения "соединение открыто", "соединение закрыто" и "полученное сообщение" никогда не печатаются в окне терминала.
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
class MyHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "connection opened"
self.write_message("connection opened")
def on_close(self):
print "connection closed"
def on_message(self,message):
print "Message received: {}".format(message)
self.write_message("message received")
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/",MyHandler)])
server = tornado.httpserver.HTTPServer(app)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Ответы
Ответ 1
добавьте
def check_origin(self, origin):
return True
в классе MyHandler как это
class MyHandler(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True
def open(self):
print "connection opened"
self.write_message("connection opened")
def on_close(self):
print "connection closed"
def on_message(self,message):
print "Message received: {}".format(message)
self.write_message("message received")
Из DOC:
По умолчанию [check_origin] отклоняет все запросы с источником на хосте, отличном от этот.
Это защита для защиты от межсайтовых скриптовых атак на браузеров, поскольку WebSockets разрешено обходить обычное одноименное происхождение политики и не использовать заголовки CORS.
И снова:
Это важная мера безопасности; не отключать его без понимая последствия для безопасности. В частности, если аутентификация основана на файлах cookie, вы должны либо ограничить исход разрешено check_origin() или реализует вашу собственную XSRF-подобную защиту для сетевых соединений. Подробнее см. эти статьи.
Ссылка.
Ответ 2
Немного измененное решение @maxhawkdown.
from tornado.util import PY3
if PY3:
from urllib.parse import urlparse # py2
xrange = range
else:
from urlparse import urlparse # py3
class ChatHandler(tornado.websocket.WebSocketHandler):
CORS_ORIGINS = ['localhost']
def check_origin(self, origin):
parsed_origin = urlparse(origin)
# parsed_origin.netloc.lower() gives localhost:3333
return parsed_origin.hostname in self.CORS_ORIGINS