столкнулся с одной серьезной трудностью, связанной с идентификацией пользователей при обмене сообщений между сервером торнадо и клиентом. Во множестве примеров используется идентификация пользователя спомощью id сессии. Но насколько я понял, sockjs на сервере не принимает никаких куков.
Вот типичный код из туториалов:
def get_session(session_key): return _engine.SessionStore(session_key) def get_user(session): class Dummy(object): pass django_request = Dummy() django_request.session = session return django.contrib.auth.get_user(django_request) class Connection (SockJSConnection): def on_open(self, info): """ Определяем сессию django. """ self.django_session = get_session(info.get_cookie('sessionid').value) self.user = get_user(self.django_session)
на строчке :
self.django_session = get_session(info.get_cookie('sessionid').value)
Судя по всему туториалы уже не освсем актуальны
на гитхабе один из ведущих разработчиков sockjs предлагает такой вариант аутентификации пользователей
client side
<script language="javascript"> var sock = new SockJS('/echo'); // Lets assume we invented simple protocol, where first word is a command name and second is a payload. sock.onconnect = function() { sock.send('auth,xxx'); sock.send('echo,bar'); }; </script>
server side
class EchoConnection(SockJSConnection): def on_open(self, info): self.authenticated = False def on_message(self, msg): pack, data = msg.split(',', 1) # Ignore all packets except of 'auth' if user is not yet authenticated if not self.authenticated and pack != 'auth': return if pack == 'auth': # Decrypt user_id (or user name - you decide). You might want to add salt to the token as well. user_id = des_decrypt(data, secret_key) # Validate user_id here by making DB call, etc. user = get_user(user_id) if user is None and user.is_active: self.send('error,Invalid user!') return self.authenticated = True elif pack == 'echo': self.send(data)
Но для меня тема альтернативной аутентификации пользователей тема абсолютно новая. До последнего времени доверял это дело движку django. И теперь не совсем понимаю что делать.
Нашел некий Rest Framework, который генерит токены для пользователей, а также некоторые рекомендуют использовать redis для хранения сессий, но я так и не понял каким образом это реально делается. Поделитесь опытом, в какую сторону копать. Я уже нашел альтернативный способ обработки сообщений от сокетов через nodejs + socket.io, но sockjs кажется гораздо более привлекательным, ровно как и торнадо.