簡體   English   中英

通過基本身份驗證實現安全的Flask-SocketIO通信

[英]Secure Flask-SocketIO communication with basic authentication

我有一個使用基本身份驗證進行身份驗證的Flask-SocketIO應用程序。 我試圖確保我所有的socketio通信也受到保護,至少在與基本身份驗證相同的程度上。

從Flask-SocketIO的身份驗證文檔中:

但是,在大多數情況下,在建立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

這是合理的方法嗎? 我是否有陷阱? 這是沒有意義的,因為我使用的是基本身份驗證嗎?

Socket.IO使用與每個客戶端的永久連接,因此實際上只需要對connect事件進行身份驗證。 如果用戶無效,則從此事件返回False ,並且將不接受連接。 在任何其他情況下,連接都經過身份驗證,無需在每次發出事件時再次驗證用戶。

由於只需要對用戶進行一次身份驗證,因此我通常不會為此編寫裝飾器,而只是將驗證邏輯直接添加到connect事件處理程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM