Я создаю настольное приложение с помощью electronic-vue и бэкэнда laravel. Я настроил Laravel Echo в проекте, и использование Echo.channel()
сработало отлично. Теперь я попытался использовать канал присутствия с Echo.join()
, и, похоже, он вообще ничего не делает. Я вижу соединение в консоли отладки толкателя, но оно никогда не присоединяется к каналу. Самое странное, что он тоже никогда не делает запрос на мой сервер для авторизации.
В моем файле 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.info(`joining presence channel: display.${this.display.id}`)
Echo.join(`display.${this.display.id}`)
.here((users) => {
console.info('Users here: ')
console.info(users)
})
}
}
Срабатывает console.info(), сообщающий о «присоединении к каналу присутствия», но console.info() в методе here() никогда не срабатывает. И, глядя на вкладку сети в Chrome, я вижу, что она никогда не делает запрос к /broadcasting/auth
.
У меня есть все настройки для авторизации каналов. На самом деле у меня есть приложение inertiajs в проекте laravel, использующее тот же канал присутствия, с тем же кодом, и оно просто присоединяется к find. Я просто не могу заставить работать электронное приложение.
Может кто-то указать мне верное направление?
Похоже, я наконец добрался до сути. Проведя еще немного исследований, я обнаружил, что инструменты для разработки электронов, по-видимому, просто не показывали запрос на маршрут авторизации, так как я просмотрел свой access_log и увидел, что он действительно попадает на этот маршрут. В журнале доступа я также мог видеть, что получаю ответ 403.
Поскольку мне нужно, чтобы и мое электронное приложение, и мое инерционное веб-приложение могли аутентифицироваться на этих каналах, я изменил метод загрузки 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
.
После внесения этих изменений, похоже, я могу нормально присоединиться к каналам присутствия.