当前,在用户 登录后,我使用JSON 返回一个token。随后,他们必须向 index 页面发出请求,并在 HTTP Authorization header 中传递 token。
index.html 页面包含以下内容:
var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
socket.on('connect', function() {
socket.emit('join', {room: 'venue_1'});
});
如果用户遵循这个事件过程,那么只有在他们登录之后才能连接到socket。但是,我试图防止有人可能只是创建一个包含上述代码的 html 文件,而不是先通过 login 步骤。
服务器代码
@socketio.on('connect', namespace='/test')
def test_connect():
# Can anything be done here to verify a user?
emit('my response', {'data': 'Connected'})
有没有一种方法可以将 token 传递给上面的 connect 事件,以便我可以在那里验证用户。如果 token 最终无效,我可能会运行一个 disconnect 调用。
或者这是否需要在我进行以下调用时发生?
socket.emit('join', {room: 'venue_1', token:'token1234'});
感谢您的帮助。
请您参考如下方法:
Flask-SocketIO 的文档包括关于 Authentication 的部分.
该解决方案基于 SocketIO 处理程序中 HTTP 上下文(用户 session 和 cookie)的可用性。如果您使用 Flask-Login 来管理用户 session ,则 current_user 上下文变量在您的套接字处理程序中可用。例如:
@socketio.on('connect', namespace='/test')
def test_connect():
if not current_user.is_authenticated()
return # do not respond or disconnect
# user is authenticated
emit('my response', {'data': 'Connected'})
