2
votes

I'm using laravel-echo-server along with Redis and vuejs to broadcast events through websockets in Laravel 5.5. with public channels it is working fine and events get broadcasted to client-side correctly. But when I change it to private channel I face problem of authentication even if the callback function inside channel.php file just return true and does not contain any logic for authentication. I'm using Sentinel authentication package and I don't know if this is the problem. But as I said, when just returning 'true' the problem of authentication still there.

When I check laravel-echo-server I see that there is a error message that says "could not be authenticated, got http code 419".

I read that there are some guys face same issue and what they got is maybe a csrf-token issue or private channel works only with the integrated auth package...etc.

I have included the csrf-token header inside window.Echo config but no result.

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001',
auth: {
headers: {
'X-CSRF-TOKEN': $('meta[name=csrf-token]).attr(content)
}
}
});

routes/channel.php

<?php

Broadcast::channel('adminNotify', function() {
    return true;
});

What I did actually in order to make the admin which has the id of 1 able to receive the event is this:

<?php

use Cartalyst\Sentinel\Laravel\Facades\Sentinel;

Broadcast::channel('adminNotify', function () {
    return (int) Sentinel::check()->id === 1;
});

App\Events\NotifyAdminEvent

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Ad;
use Sentinel;

class NotifyAdminEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $ad;

    public function __construct(Ad $ad)
    {
        $this->ad = $ad;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('adminNotify');
    }
}

app.js

require('./bootstrap');
window.Vue = require('vue');

import Echo from 'laravel-echo';

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

laravel-echo-server.json

{
    "authHost": "http://192.168.10.11",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "64fe4c095b0ffb30",
            "key": "9e2bf37f9b3c8c88c3c5f5e207754f1d"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}

Laravel log does not log anything so I find it difficult to know what's going on and solve the problem.

1
You can answer your own question, take a look. - Rubens Farias
I've rolled back your edit. It is not proper to edit your post to add (Solved) or add a solution. If you want to share the solution you found, you can write an answer that does so in the space below with the heading Your Answer. If you simply want the question to go away, you can delete it using the link below the tags. More info is available in the help center. - Ken White
I don't know this could help you or not! here - Mr Theavuth

1 Answers

1
votes

I have figured out what happened. The problem was in laravel-echo-server.json file and exactly in the first line "authHost" where instead of putting the ip I had to put the domaine name.

{
    "authHost": "http://webdev-app.test",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "64fe4c095b0ffb30",
            "key": "9e2bf37f9b3c8c88c3c5f5e207754f1d"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}