Я использую 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 для аутентификации каналов, а не токен паспорта, поскольку я не использую паспорт.
Я сталкивался со многими вопросами, но все они говорят только о паспортных токенах.
Пожалуйста, помогите мне в этом.