Безопасная связь Flask-SocketIO с базовой аутентификацией - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть приложение 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

Это разумный подход?Есть ли подводные камни, которые мне не хватает?Это бессмысленно, потому что я использую базовую аутентификацию?

1 Ответ

0 голосов
/ 23 сентября 2018

Socket.IO использует постоянное соединение с каждым клиентом, поэтому на самом деле требуется только аутентификация события connect.Если пользователь недействителен, вы возвращаете False из этого события, и соединение не будет принято.В любых других случаях соединение аутентифицируется, и нет необходимости повторно проверять пользователя каждый раз, когда он отправляет событие.

Поскольку существует необходимость аутентификации пользователя только один раз, я склонен не писатьДля этого я просто добавляю логику проверки прямо в обработчик событий подключения.

...