【发布时间】:2018-09-22 19:02:36
【问题描述】:
我有一个使用基本身份验证进行身份验证的 Flask-SocketIO 应用程序。我正在努力确保我的所有 socketio 通信也受到保护,至少与基本身份验证的程度相同。
来自 Flask-SocketIO 在authentication 上的文档:
但是,在大多数情况下,在建立 SocketIO 连接之前执行传统的身份验证过程会更方便。然后,用户的身份可以记录在用户会话或 cookie 中,稍后当 SocketIO 连接建立时,SocketIO 事件处理程序将可以访问该信息。
因此,我试图弄清楚如何通过用户会话安全地存储一些东西。假设我执行以下操作,首先登录,我签署了散列的用户名和密码:
from flask import session
from itsdangerous import Signer
signer = Signer('super secret key')
def login(username: str, password: str):
if (username, password) in credentials:
hashed = hash(username + password)
session['user'] = s.sign(hashed)
然后我可以为我的 socketio 侦听器制作一个装饰器,它只检查会话中的签名值是否有效:
def authenticated_only(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
try:
signer.unsign(session['user'])
return f(*args, **kwargs)
except BadSignature:
disconnect()
return wrapped
@socketio.on('my event')
@authenticated_only
def handle_my_custom_event(data):
pass
这是一个合理的方法吗?有我遗漏的陷阱吗?这是因为我使用的是基本身份验证而毫无意义吗?
【问题讨论】:
标签: python authentication flask socket.io flask-socketio