Flask SocketIO通过发送令牌在连接事件上进行身份验证

1 python authentication flask-socketio

目前,user登录后,我返回了tokenusing JSON。随后,他们必须向该index页面发出请求,并在token中传递HTTP Authorisation header

index.html页面包含以下内容:

var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);

socket.on('connect', function() {          
          socket.emit('join', {room: 'venue_1'}); 
});  
Run Code Online (Sandbox Code Playgroud)

如果user遵循此事件过程,socket则只有在事件之后才可以连接login。但是,我试图防止有人可能只创建html包含上述代码的文件,而不先执行该login步骤的情况。

服务器代码

@socketio.on('connect', namespace='/test')
def test_connect():

    # Can anything be done here to verify a user?

    emit('my response', {'data': 'Connected'})
Run Code Online (Sandbox Code Playgroud)

有没有办法将a传递token给上述connect事件,以便在那里验证用户。如果token最终无效,我可以打个disconnect电话。

还是在我打以下电话时需要发生这种情况?

socket.emit('join', {room: 'venue_1', token:'token1234'}); 
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

Mig*_*uel 5

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'})
Run Code Online (Sandbox Code Playgroud)