Flask SocketIO 通过发送令牌对连接事件进行身份验证
Flask SocketIO authenticate on connect event by sending token
当前 user
登录后,我 return 使用 JSON
token
。随后他们必须向 index
页面发出请求并在 HTTP Authorisation header
.
中传递 token
index.html
页面包含以下内容:
var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
socket.on('connect', function() {
socket.emit('join', {room: 'venue_1'});
});
如果 user
遵循此事件过程,则只有在 login
之后才能连接到 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 上下文(用户会话和 cookie)的可用性。如果您使用 Flask-Login 来管理用户会话,那么 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'})
当前 user
登录后,我 return 使用 JSON
token
。随后他们必须向 index
页面发出请求并在 HTTP Authorisation header
.
token
index.html
页面包含以下内容:
var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
socket.on('connect', function() {
socket.emit('join', {room: 'venue_1'});
});
如果 user
遵循此事件过程,则只有在 login
之后才能连接到 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 上下文(用户会话和 cookie)的可用性。如果您使用 Flask-Login 来管理用户会话,那么 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'})