Django websockets auth - PullRequest
       20

Django websockets auth

0 голосов
/ 02 января 2019

Я использую tornado + sockjs для веб-сокетов и Django rest framework для основного приложения. Также я использую rest-framework-jwt для аутентификации в приложении Django. Теперь я должен определить пользователя в торнадо. Как я это вижу:

  1. Пользователь отправляет jwt в сообщении, когда sockjs подключен к серверу торнадо.
  2. Tornado server анализирует jwt и определяет действительный jwt или нет? Но для этого решения я должен прочитать базу данных. Но эта операция - синхронизация, которая не хороша, потому что торнадо - асинхронный.

Также я подумал использовать сельдерей. Когда пользователь подключен к торнадо, торнадо создает задание для сельдерея, и в этом задании jwt будет проанализирован. В этом случае решение не блокирует торнадо. Но как тогда заметить пользователя через websockets о проверке jwt?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вот что я бы сделал:

Share JWT beetween Django and Tornado

Redis быстрый и легкий, и вы можете подключиться к нему асинхронно из Торнадо.

Здесь нет необходимости в сельдерее.

0 голосов
/ 03 января 2019

Если вы будете использовать SQLAlchemy, для подключения и обработки базы данных, вы можете использовать tornado-sqlalchemy, чтобы сделать асинхронный запрос к базе данных и уведомить вашего пользователя через WebSocket без цикла событий прерывания торнадо.

@coroutine
def open(self):
   with self.make_session() as session:
       jtw = request.params.get('authorization')
       jwt_valid = yield self.check_jwt_valid(jwt, session)
       if not jwt_valid:
          self.write('JWT Inválid')
          self.close()      

@coroutine 
def check_jwt_valid(self, jwt, session):
   jwt_found = session.query(JWT_QUERY...).first()
   return jwt_found
...