@vutmuk123

Как связать данные пользователя из http и soketio протоколов?

Здравствуйте. Есть веб сервер aiohttp. На нем функция handler которая проводит аутентификацию клиента (думаю не суть важно как) и рендерит страничку. В js файле этой страницы запускается вебсокет. Я хочу связать имя клиента из handler с его sid, но не понимаю как это сделать. В доках python-socketio написано:
connectСобытие является идеальным местом для выполнения аутентификации пользователя, и любое необходимое отображение между объектами пользователей в приложении и sid который был присвоен клиенту. environАргумент представляет собой словарь в стандартном формате WSGI , содержащей информацию запроса, включая HTTP - заголовки.

Но меня это не приближает к решению, ведь handler и connect работают совершенно независимо друг от друга... подскажите, в какую сторону копать?)
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 2
NeiroNx
@NeiroNx
Программист
@vutmuk123 Автор вопроса
Пока я так и не придумал как получить объект сессии в connect функции и надо ли оно мне вообще. Пока наверное обойдусь тем, что получаю имя из шифрованной сессии aiohttp:
@sio.event
async def connect(sid, environ):
    obj = ast.literal_eval(authenticate_user(environ))
    username = obj['session']['username']
    await sio.save_session(sid, {'username': username})
    print("connect ", sid, username)


def authenticate_user(environ):
    cookies = environ['HTTP_COOKIE'].split(';')
    regexp = ' \s*AIOHTTP_SESSION='
    for i in cookies:
        if re.match(regexp, i):
            AIOHTTP_SESSION =re.split(regexp, i)[-1]
    f = fernet.Fernet(fernet_key)
    return f.decrypt(bytes(AIOHTTP_SESSION, 'utf-8')).decode('utf-8')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы