我有一个Flask-SocketIO应用程序,该应用程序已通过基本身份验证进行了身份验证。我试图确保我的所有socketio通信也受到保护,至少在与基本身份验证相同的程度。
摘自authentication上Flask-SocketIO的文档:
但是,在大多数情况下,在建立SocketIO连接之前执行传统的身份验证过程更为方便。然后,可以将用户的身份记录在用户会话或cookie中,然后在建立SocketIO连接后,SocketIO事件处理程序将可以访问该信息。
因此,我试图弄清楚如何在用户会话中存储安全的内容。假设我执行以下操作,首先登录,然后对哈希的用户名和密码签名:
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Initializing gradle... 4.0s
Resolving dependencies... 86.8s
Running 'gradlew assembleDebug'... 34.2s
Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk... 0.3s
Error: ADB exited with exit code 1
adb: failed to install /Users/build/app/outputs/apk/app.apk:
Exception occurred while executing:
android.os.ParcelableException: java.io.IOException: Requested internal only, but not enough space
at android.util.ExceptionUtils.wrap(ExceptionUtils.java:34)
at com.android.server.pm.PackageInstallerService.createSession(PackageInstallerService.java:406)
at com.android.server.pm.PackageManagerShellCommand.doCreateSession(PackageManagerShellCommand.java:2415)
at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:907)
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:158)
at android.os.ShellCommand.exec(ShellCommand.java:103)
at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:21260)
at android.os.Binder.shellCommand(Binder.java:634)
at android.os.Binder.onTransact(Binder.java:532)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2796)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.ja
Error launching application on Android SDK built for x86.
然后,我可以为我的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)
这是一种合理的方法吗?我是否有陷阱?这是没有意义的,因为我使用的是基本身份验证吗?
答案 0 :(得分:1)
Socket.IO使用与每个客户端的永久连接,因此实际上只需要对connect
事件进行身份验证。如果用户无效,则从此事件返回False
,并且将不接受连接。在任何其他情况下,连接都经过身份验证,无需在每次发出事件时再次验证用户。
由于只需要对用户进行一次身份验证,因此我通常不为此编写装饰器,我只是直接在connect事件处理程序中添加验证逻辑。