Laravel 5 - Authenticate user in NodeJS with socket io using JWT.

By Hardik Savani | September 25, 2016 | | 33218 Viewer| Category : LaravelInstallationServerNode JSSocket.ioJWT

Today, i am going to show you how to authenticate user node js using JWT and socket io in Laravel 5.3. It is very very important because if you are working with chat application or messengers system etc with user then you have to use JWT token because it is very safe and secure way.

If we work on chat module with socket io but someone can easily hack our code. At that time we require to check given JWT token is valid or not using socketio-jwt package of Node.

socketio-jwt package thorough we can simply authentication with user and identify that token is valid or not, and also we can get information of login user from JWT token like user_id, name, email etc as we require.

But you thinking how we can do this with Laravel. So, you have to just follow bellow step because it from scratch.

Step 1: Install Laravel 5 Application

In this step, if you haven't laravel 5 application setup then we have to get fresh laravel 5 application. So run bellow command and get clean fresh laravel 5.3 application.

composer create-project --prefer-dist laravel/laravel blog

Ok, now go on Laravel application root directory and run bellow command, this commands for make auth and create migration table.

php artisan make:auth

php artisan migrate

Step 2: JWT Package Installation

JWT stand for Json Web Token. JWT will helps to create authentication and connect front-end and back-end function. JWT through we can create login and register API. So first we have to install "tymon/jwt-auth" package in laravel 5.

We are also installing barryvdh/laravel-cors package for handle Cross-Origin Resource Sharing (CORS).

So, run bellow command and install.

composer require barryvdh/laravel-cors tymon/jwt-auth

After install this package, Now open config/app.php file and add service provider.


'providers' => [






After this we have to publish configuration by following command:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"

Ok now, we have to add the CORS middleware to the `app/Http/Kernel.php` global as like bellow:



protected $middlewareGroups = [

'web' => [




'api' => [






Ok, now we have to make more secure JWT token using JWT Secret, so we can set JWT secret on our '.env' file so open env file and put bellow line:



Step 3: Create Token Route

In this is step we need to create route of generate JWT token. so open your routes/web.php file and add following route.

Route::get('token', 'TokenController@token');

Step 4: Create Controller

In this step, now we should create new controller as TokenController in this path app/Http/Controllers/TokenController.php. this controller will return us a token, so put bellow content in controller file:


namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use Illuminate\Support\Facades\Auth;

use Tymon\JWTAuth\Facades\JWTAuth;

class TokenController extends Controller


public function token(Request $request, \Tymon\JWTAuth\JWTAuth $auth)



$user = Auth::user();

$claims = ['userid' => $user->id, 'email' => $user->email];

$token = $auth->fromUser($user, $claims);

return response()->json(['token' => $token]);



Step 5: Install Node JS

in this step we will install nodejs if you haven't installed at. So, make sure you can check if nodejs is not install then you can fire following command and install nodejs easily.

sudo apt-get update

sudo apt-get install nodejs

Step 6: Install npm

we have to also need to install npm because we will install more, socketio-jwt and express package using npm command, so if you not installed this command before then install by following command.

sudo apt-get install npm

Step 7: Install NodeJS Other Packages

In this step we have to require install several package like as bellow:

1) Express


3) Dotenv

4) Socketio-jwt

Run bellow command and install above nodejs packages:

npm install express socketio-jwt dotenv --save

Step 8: NodeJS File(Server Side)

Now we have to create nodejs file, So first go on laravel root directory and create nodejs. and inside that folder create server.js File. Put bellow code on that file:


var express = require('express');

var app = express();

var server = require('http').createServer(app);

var io = require('')(server);

var socketioJwt = require('socketio-jwt');

var myEnv = require('dotenv').config({path:'../.env'});


Accept connection and authorize token code


io.on('connection', socketioJwt.authorize({

secret: myEnv.JWT_SECRET,

timeout: 15000



When authenticated, send back userid + email over socket


io.on('authenticated', function (socket) {


socket.emit('user-id', socket.decoded_token.userid);


socket.on('public-my-message', function (data) {

socket.emit('receive-my-message', data.msg);




Start NodeJS server at port 3000



Step 9: JS File(Client Side)

Ok, in Last step we have to create myauth.html file. In this file i write code for fire Ajax and get token from Laravel and then emit token on nodejs server.

So, put bellow code on that file:


<!doctype html>

<html lang="en">


<script src="//"></script>

<script src=""></script>



<h1>Socket Connection Status: <span id="connection"></span></h1>

<h1>Login User Id: <span id="userid"></span></h1>

<h1>Login User Email: <span id="email"></span></h1>

<h1>Public Message: <span id="receive-my-message"></span></h1>

<script type="text/javascript">

$(document).ready(function () {

socketIOConnectionUpdate('Requesting JWT Token from Laravel');


url: 'http://localhost:8000/token?id=1'


.fail(function (jqXHR, textStatus, errorThrown) {

socketIOConnectionUpdate('Something is wrong on ajax: ' + textStatus);


.done(function (result, textStatus, jqXHR) {


make connection with localhost 3000


var socket = io.connect('http://localhost:3000');


connect with socket io


socket.on('connect', function () {

socketIOConnectionUpdate('Connected to SocketIO, Authenticating')

socket.emit('authenticate', {token: result.token});

socket.emit('public-my-message', {'msg': 'Hi, Every One.'});



If token authenticated successfully then here will get message


socket.on('authenticated', function () {




If token unauthorized then here will get message


socket.on('unauthorized', function (data) {

socketIOConnectionUpdate('Unauthorized, error msg: ' + data.message);



If disconnect socketio then here will get message


socket.on('disconnect', function () {




Get Userid by server side emit


socket.on('user-id', function (data) {




Get Email by server side emit


socket.on('user-email', function (data) {




Get receive my message by server side emit


socket.on('receive-my-message', function (data) {






Function for print connection message


function socketIOConnectionUpdate(str) {






Ok, Finally we are ready for run but Make sure following point:

1) You must have one user with id = 1 in your users table

2) run laravel application by bellow command :

php artisan serve

3) run nodejs file by bellow command:

nodejs server


node server

4) run myauth.html file.

That's IT.

Maybe it can help you....

We are Recommending you: