Эхо Laravel в приложении electron-vue — join () не работает

#laravel #vue.js #electron #pusher #laravel-echo

#laravel #vue.js #electron #толкатель #laravel-echo

Вопрос:

Я создаю настольное приложение с electron-vue и серверной частью laravel. Я настроил Laravel Echo в проекте, и использование Echo.channel() работало нормально. Теперь я попытался использовать канал присутствия Echo.join() , и, похоже, он вообще ничего не делает. Я вижу соединение в консоли отладки pusher, но оно никогда не присоединяется к каналу. Самое странное, что он никогда не отправляет запрос на мой сервер для авторизации.

В моем renderer/main.js файле я создаю экземпляр Echo:

 window.Pusher = require('pusher-js')
window.Echo = new Echo({
  broadcaster: 'pusher',
  key: Keys.PUSHER_KEY,
  cluster: Keys.PUSHER_CLUSTER,
  forceTLS: true,
  authEndpoint: `${apiUrl}/broadcasting/auth`
})

if(localStorage.getItem('api_key')) {
  let key = localStorage.getItem('api_key')
  axios.defaults.headers.common['Authorization'] = 'Bearer '   key
  window.Echo.connector.pusher.config.auth.headers['Authorization'] = 'Bearer '   key
}
 

Затем в моем компоненте у меня есть следующий код для подключения к каналу присутствия. Отображение происходит из vuex, поэтому я запускаю его из наблюдателя:

 watch: {
  'display.id': {
    immediate: true,
    handler: function(newVal) {
      if(newVal) {
        this.joinPresenceChannel()
      }
    }
  }
},
methods: {
  joinPresenceChannel() {
    console.log(`joining presence channel: display.${this.display.id}`)
    Echo.join(`display.${this.display.id}`)
        .here((users) => {
          console.log('Users here: ')
          console.log(users)
        })
  }
}
 

Срабатывает console.log() с надписью «присоединение к каналу присутствия», но console.log() в методе here() никогда не срабатывает. И, глядя на вкладку network в Chrome, я вижу, что она никогда не запрашивает /broadcasting/auth .

У меня также есть серверная часть, настроенная для авторизации каналов. На самом деле у меня есть приложение inertiajs в проекте laravel, использующее тот же канал присутствия, с тем же кодом, и он присоединяется только к find. Кажется, я просто не могу заставить приложение electron работать.

Кто-нибудь может указать мне правильное направление?

Ответ №1:

Похоже, я наконец-то добрался до сути. Проведя еще немного исследований, я обнаружил, что electron devtools, по-видимому, просто не показывал запрос на маршрут авторизации, поскольку я сделал хвост в своем access_log и увидел, что он фактически попадает на этот маршрут. В журнале доступа я также мог видеть, что получаю ответ 403.

Поскольку мне нужно, чтобы мое приложение electron и мое веб-приложение inert могли проходить аутентификацию по этим каналам, я изменил метод BroadcastServiceProvider загрузки, чтобы он выглядел следующим образом:

 public function boot()
{
    Broadcast::routes(['middleware' => 'web']);
    Broadcast::routes(['prefix' => 'api', 'middleware' => ['api', 'auth:sanctum']]);

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

Я также обнаружил, что это не будет работать, если вы не добавите auth:sanctum промежуточное программное обеспечение в маршрут API. Вы также должны обязательно обновить клиент, чтобы использовать /api/broadcasting/auth маршрут вместо маршрута по умолчанию /broadcasting/auth .

После внесения этих изменений, похоже, я могу нормально подключаться к каналам присутствия.