首页 > 解决方案 > 无法使用 redis 和 socket.io 验证我的私人频道

问题描述

我正在使用 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"
    }
}

广播服务提供者.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');
    }
}

频道.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 令牌来验证通道,而不是护照令牌,因为我没有使用护照。

我遇到了很多问题,但他们都只是在谈论护照令牌。

请在这方面帮助我。

标签: phplaravelredissocket.iolaravel-echo

解决方案


推荐阅读