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'})