К этой части переходим, если у нас уже есть приложение на Laravel.
На стороне Node.js будем использовать следующие пакеты:
Переходим в папку node. И устанавливаем необходимые зависимости:
npm install express socket.io socketio-jwt dotenv mysql --save
Теперь внутри папки node, создаем файл auth.js со следующим содержимым:
// Load basics var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); var socketioJwt = require('socketio-jwt'); require('dotenv').config({path: '../laravel/.env'});
В этих строках кода мы подключили все необходимые компоненты, которые только что установили. В строке dotenv
загрузили файл .env из Laravel.
Далее подключаемся к базе данных:
var db = mysql.createConnection({ host: 'localhost', user: 'root', port: '3307', database: 'world', password: '' })
Настраиваем сокетное соединение:
io.on('connection', socketioJwt.authorize({ secret: process.env.JWT_SECRET, timeout: 15000 }));// When authenticated, send back name + email over socket io.on('authenticated', function (socket) { console.log(socket.decoded_token, socket.decoded_token.sub); socket.emit('id', socket.decoded_token.sub); }); server.listen(3003);
На стороне Laravel пишем клиента:
$(document).ready(function () { const socket = io.connect('http://localhost:3003'); socket.on('connect', () => { socket .emit('authenticate', { token: '{{auth('api')->tokenById(auth::user()->id)}}' }) //send the jwt .on('authenticated', () => { socket.on('id', function (rows) { var html = JSON.stringify(rows); connectionUpdate(html); }); }) .on('unauthorized', (msg) => { console.log(`unauthorized: ${JSON.stringify(msg.data)}`); throw new Error(msg.data.type); }) }); }); function connectionUpdate(str) { $('#connection').html(str); console.log(str); }
Осталось создать элемент с id="connection"
Node.js отправляет id аутентифицированного пользователя. Чтобы это работало, нам также нужно позволить Laravel создать токен и убедиться, что браузер действительно может получить этот токен.