У меня постоянно возникает ошибка 500, когда я пытаюсь подписаться на частный канал с помощью pusher в моем собственном приложении для реагирования. Бэкэнд - это laravel с паспортным сервером oauth.
Я установил конечную точку аутентификации в настройках толкателя (http://url/broadcasting/auth)
Настройка push-native pusher
import Pusher from 'pusher-js/react-native';
Pusher.logToConsole = true;
var pusher = new Pusher('pusher-key', {
authEndpoint: 'http://url.com/broadcasting/auth',
cluster: 'ap1',
encrypted: true
});
var channel = pusher.subscribe('private-order');
channel.bind('App\\Events\\Order\\SiteHasAnsweredCheckIn', function(data) {
console.log('ok : ' + data);
});
и маршрут авторизации широковещательной передачи в моем файле routes / channel.php с обратным вызовом, просто возвращающим true, но у меня все еще возникает ошибка 500
routes / channels.php
Broadcast::channel('order', function () {
return true;
});
Вот класс события
<?php
namespace App\Events\Order;
use App\Site;
use App\User;
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;
class SiteHasAnsweredCheckIn implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $site;
public $user;
public $checkInConfirmed;
/**
* Create a new event instance.
*
* @param Site $site
* @param User $user
* @param $checkInConfirmed
*/
public function __construct(Site $site, User $user, $checkInConfirmed)
{
$this->site = $site;
$this->user = $user;
$this->checkInConfirmed = $checkInConfirmed;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('order');
}
}
Обратная связь с консоли, в которой говорится: «Pusher: не удалось получить информацию об авторизации из вашего веб-приложения: 500», не очень полезна для отладки. Так сложно указать, что не так. Если есть идеи?
Если нет, как я могу получить дополнительную информацию / обратную связь из HTTP-ответа из ответа толкача?
Спасибо.
РЕДАКТИРОВАТЬ:
После ответа ниже я обновил маршрут следующим образом. Обратите внимание: маршруты api / * не проходят проверку токена csrf, поскольку я исключил их из промежуточного программного обеспечения.
По-прежнему возникает ошибка 500. Есть ли способ получить более подробную информацию об ошибке, выданной Pusher? Было бы полезно получить еще несколько отзывов, чтобы понять, что происходит.
Новая конечная точка аутентификации:
Route::post('api/authtest', function() {
$pusher = new Pusher(config('broadcasting.connections.pusher.key'), config('broadcasting.connections.pusher.secret'), config('broadcasting.connections.pusher.app_id'));
echo $pusher->socket_auth($_POST[request()->channel_name], $_POST[request()->socket_id]);
})->middleware('auth:api');
ИЗМЕНИТЬ 2:
Я заставил его работать, удалив промежуточное ПО авторизации.
Route::post('api/authtest', function() {
$pusher = new Pusher(config('broadcasting.connections.pusher.key'), config('broadcasting.connections.pusher.secret'), config('broadcasting.connections.pusher.app_id'));
echo $pusher->socket_auth($_POST[request()->channel_name], $_POST[request()->socket_id]);
});
Но, очевидно, идея состоит в том, чтобы заставить пользователя сделать такой запрос, чтобы я мог дать надлежащую авторизацию.
Вот как я передаю свой токен аутентификации вызову pusher из react-native, но получаю ответ 401.
let token = 'auth_access_token_taken_from_database';
var pusher = new Pusher('pasher_key', {
authEndpoint: 'http://url.com/api/authtest',
auth: {
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer ' + token
}
},
cluster: 'ap1',
encrypted: true
});
var channel = pusher.subscribe('private-order');
Все мои другие запросы на получение и отправку oauth с этим промежуточным программным обеспечением и токеном, указанными выше, правильно работают с моими вызовами axios.
Любая идея?