通过基本身份验证确保 Flask-SocketIO 通信的安全

Jac*_*vam 1 python authentication flask socket.io flask-socketio

我有一个使用基本身份验证进行身份验证的 Flask-SocketIO 应用程序。我试图确保我的所有套接字通信也受到保护,至少达到与基本身份验证相同的程度。

\n\n

来自 Flask-SocketIO 有关身份验证的文档:

\n\n
\n

然而,大多数情况下,在建立 SocketIO 连接之前执行传统的身份验证过程更为方便。然后可以将 user\xe2\x80\x99s 身份记录在用户会话或 cookie 中,稍后当建立 SocketIO 连接时,SocketIO 事件处理程序将可以访问该信息。

\n
\n\n

因此,我试图弄清楚如何通过用户会话来安全地存储某些内容。假设我执行以下操作,首先登录,我签署了哈希用户名和密码:

\n\n
from flask import session\nfrom itsdangerous import Signer\n\nsigner = Signer(\'super secret key\')\ndef login(username: str, password: str):\n    if (username, password) in credentials:\n        hashed = hash(username + password)\n        session[\'user\'] = s.sign(hashed)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我可以为我的 socketio 侦听器创建一个装饰器,它只需检查会话中的签名值是否有效:

\n\n
def authenticated_only(f):\n    @functools.wraps(f)\n    def wrapped(*args, **kwargs):\n        try:\n            signer.unsign(session[\'user\'])\n            return f(*args, **kwargs)\n        except BadSignature:\n            disconnect()\n    return wrapped\n\n@socketio.on(\'my event\')\n@authenticated_only\ndef handle_my_custom_event(data):\n    pass\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个合理的做法吗?有我遗漏的陷阱吗?这是没有意义的,因为我正在使用基本身份验证?

\n

Mig*_*uel 6

Socket.IO 使用与每个客户端的永久连接,因此实际上只需要对事件进行身份验证connect。如果用户无效,您将从False该事件返回并且连接将不被接受。在任何其他情况下,连接都会经过身份验证,并且无需在每次发出事件时再次验证用户。

由于只需要对用户进行一次身份验证,因此我倾向于不为此编写装饰器,而是直接在连接事件处理程序中添加验证逻辑。