authentication issue with laravel private channel and laravel-echo-server

随声附和 提交于 2020-01-03 04:19:04

问题


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:


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": ""
    }
}


来源:https://stackoverflow.com/questions/51814177/authentication-issue-with-laravel-private-channel-and-laravel-echo-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!