Skip to main content
 首页 » 编程设计

python之Flask SocketIO 通过发送 token 对连接事件进行身份验证

2025年05月04日35powertoolsteam

当前,在用户 登录后,我使用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'})