如何解决Socket.IO Django框架中的401未授权错误



我正在尝试让Socket.IO与我的Django服务器一起工作。这是我的设置:

前端js:

const socket = io.connect('127.0.0.1:8001');
socket.on('connect', () => {
console.log('socket id: %sn', socket.id);
});

Django服务器:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
sio = socketio.Server(async_mode='eventlet', cors_allowed_origins='*', logger=True, engineio_logger=True)
@sio.event
def connect(sid, environ, auth):
print('connect ', sid, auth)
static_files = {
'/public': './static',
}
application = socketio.WSGIApp(sio, application, static_files=static_files)
eventlet.wsgi.server(eventlet.listen(('', 8001)), application)

依赖

Django==2.2.11
django-cors-headers==3.0.0
eventlet==0.30.0
gunicorn==19.7.1
python-socketio==4.6.1
...

当我运行js时,服务器会在到达连接功能之前返回401未经授权的错误。前端:

GET http://127.0.0.1:8001/socket.io/?EIO=3&transport=polling&t=NYKlRjO 401 (UNAUTHORIZED)

Django服务器日志:

(11053) accepted ('127.0.0.1', 34906)
127.0.0.1 - - [02/Apr/2021 15:39:31] "GET /socket.io/?EIO=3&transport=polling&t=NYKlTB8 HTTP/1.1" 401 253 0.002482

但奇怪的是,如果我评论掉了connect事件,那么像其他事件一样的一切都很好:

# @sio.event
# def connect(sid, environ, auth):
#     print('connect ', sid, auth)

Django服务器运行在同一个8001端口上。我不认为对连接事件或套接字进行任何身份验证检查。有人知道为什么我设置了connect事件,套接字突然停止工作吗?

我花了几个小时才弄清楚这一点,因为服务器响应代码与这里的问题无关。

问题是,在我的情况下,当js试图连接到套接字服务器时,没有auth参数,因此connect函数将引发异常,以防连接失败,而conncet函数引发的所有异常都将导致401未经授权,尽管这可能不是授权问题。

修复很简单,将connect定义更改为:

@sio.event
def connect(sid, environ, auth=''):
print('connect ', sid, auth)

将解决该问题。始终从前端js发送auth令牌也是一个好主意。

最新更新