Публикации - Аутентифиация пользователей в Node.js с использованием JWT и Laravel

Реализация в Node.js

К этой части переходим, если у нас уже есть приложение на Laravel.

На стороне Node.js будем использовать следующие пакеты:

  • Express чтобы быстро вернуть html страницу, на которой будем выводить результат.
  • Socket.io для обработки сокетов.
  • Dotenv для чтения общего ключа из файла Laravel .env.
  • Socketio-jwt для обработки JWT аутентификации в socket.io
  • Mysql для подключения к базе данных Mysql

Переходим в папку 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 создать токен и убедиться, что браузер действительно может получить этот токен.

Количество комментариев: 0

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