2015-07-05 4 views
7

Я хочу аутентифицировать клиенты socket.io на основе данных сеанса клиента, созданных Laravel.Laravel 5: аутентификация клиента Socket.io с использованием данных сеанса Laravel

То, что я подумал это:

A - излучающее имя пользователя и адрес электронной почты от клиента к серверу;

B - сохранение данных, которые должен иметь мой сервер socket.io в Redis в php после входа пользователя в систему, а затем чтения его в Node.js на основе идентификатора cookie сессии. Возможно, мне захочется хранить sessionId -> "email, name" в Redis, если я предпочитаю этот подход .;

C - использование драйвера сеанса Redis в Laravel, декодирование файлов cookie, установленных Laravel, доступ к значениям сеанса Laravel из Node.js, их неэтериализация и декодирование;

Подход А, очевидно, очень небезопасный и может быть использован только для доказательства концепции.

Подход C выглядит лучше, поскольку мне не нужно дублировать или управлять данными сеанса, но только для его декодирования. Этот способ, однако, связывает мое приложение с деталями реализации управляемых сеансов Laravel и, следовательно, не подходит.

Подход B выглядит более перспективным и его проще реализовать. Однако использование подхода B означает, что я должен сам управлять некоторыми данными сеанса, чтобы socket.io мог его прочитать. Это может сделать данные сеанса Laravel и данные сеанса, которые я храню в Redis, взаимно непоследовательными, и это произойдет в какой-то момент времени. В некотором крайнем случае, например, идентификатор с истекшим сеансом может быть повторно использован, и некоторый клиент socket.io будет некорректно аутентифицирован как другой пользователь. На данный момент я не думаю о более тривиальном случае, но из-за этой несогласованности я предполагаю, что существует такой случай, и обе безопасности и UX могут быть скомпрометированы.

Что является более элегантным, надежным и безопасным способом аутентификации пользователя на основе данных сеанса Laravel в приложении socket.io? Если нет принципиально лучших подходов, и я предполагаю, что подход B лучше всего подходит для улучшения согласованности между данными сеанса, которыми я управляю, используя данные сеанса Redis и Laravel.

Весь смысл, насколько я могу судить, это доступ к данным сеанса Laravel за пределами Laravel и php и идентификация клиентов по sessionId, электронной почте и имени пользователя.

ответ

6

Я предлагаю вам использовать аутентификацию веб-токена JSON.

JSON Web Token (JWt) - относительно новый формат токена, используемый в средах с ограниченным пространством, таких как заголовки HTTP-авторизации. JWT является архивированным как метод для передачи заявлений безопасности, основанных между сторонами. More detailed info about JWT

Самый простой способ сделать это с помощью Laravel - это использовать пакет, такой как this one. Или вы можете реализовать его byserlf.

Используя JWT auth, вы сможете получить доступ к пользователю из токена. Например:

$user = JWTAuth::parseToken()->toUser(); 

Для получения более подробной информации о том, как использовать 'JWT-AUTH', посмотрите here.

+2

Похоже, что это гораздо лучший подход, чем то, о чем я думал. Я читал о JWT, и у меня появилась идея. Было бы здорово, если бы вы немного расширили свой ответ и объяснили, почему JWT будет хорошо работать для аутентификации клиентов socket.io (в случае, если у кого-то есть тот же вопрос). –

+0

Я только что добавил дополнительную информацию о JWT. –

0

Как уже отмечалось Александросом, вы должны использовать JWT.

Аутентификация JWTs с socket.io - это бриз. Вы можете использовать socketio-auth и jsonwebtoken, как описано очень хорошо в этом article, чтобы аутентифицировать ваших пользователей. Кроме того, вы можете использовать dotenv, чтобы прочитать секретный ключ для подписанных токенов из файла Laravel .env.

Для меня это нормально работает, хотя вам нужно подумать о признании недействительными жетонов. В Laravel jwt-auth позаботится об этом, используя черный список. Таким образом, на вашем узловом сервере вы должны справиться с этим сами. Или держите время лифта коротким.

0

Я нашел хорошее решение для этого около года назад. Я решил сделать его модулем, его очень прост в использовании. поможет вам получить cookie без жесткого кодирования. поможет вам получить, что идентификатор сеанса и извлечь его из MySQL и Redis

https://www.npmjs.com/package/node-laravel-session

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

Смежные вопросы