Невозможно аутентифицировать мой частный канал, используя redis и socket.io - PullRequest
0 голосов
/ 03 октября 2019

Я использую Laravel 5.8 и для вещания я использую redis, laravel echo server и socket.io, а не pusher.

Я не использую паспорт, а скорее простую аутентификацию сеанса с использованием охраны.

Я пытаюсь аутентифицировать частный канал в своем приложении.

Каждый раз, когда я получаю эту ошибку:

Client can not be authenticated, got HTTP status 403

[10:56:16 AM] - 6zlHuDCVFNgv_a1OAAAD could not be authenticated to private-public_addresses.12345.1
{
    "message": "",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException",
    "file": "/home/winlappy1/coins_orbit/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php",

Аналогичный вопрос, с которым я столкнулся на stackoverflow: this , но он не отвечает на мой случай.

Вот что я сделал:

laravel-echo-server.json

{
    "authHost": "http://localhost:8000",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "123",
            "key": "123"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "port": "6379",
            "host": "127.0.0.1"
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://localhost:80",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

BroadcastServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
         Broadcast::routes();

        require base_path('routes/channels.php');
    }
}

channel.php

Broadcast::channel('public_addresses.{address}.{purchase_id}', function ($user, $address, $purchase_id) {

    $vendor_id = $user->id;
    if (true == Purchase::findByPublicAddress($address, $vendor_id)) {
        return true;
    }
    return false;
});

Прослушивание канала в моем блейд-файле:

<meta name="csrf-token" content="{{ csrf_token() }}" />

<script src="{{asset('js/echo.js')}}"></script>
    <script src="{{asset('js/socket.io.js')}}"></script>

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

        var vendor = Echo.private(`public_addresses.12345.1`);

        vendor.listen("TransactionConfirmed", e => {
            console.log('listened to event successfully');
            console.log(e);
        });
    </script>

Здесь следует заметить, что я использую токены csrf для аутентификации каналов, а не токен паспорта, поскольку я не использую паспорт.

Я сталкивался со многими вопросами, но все они говорят только о паспортных токенах.

Пожалуйста, помогите мне в этом.

...