Laravel 在 electron-vue 应用程序中回显 - join() 不工作

Laravel echo in electron-vue app - join() not working

我正在构建一个带有 electron-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.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() 表示“加入状态频道”会触发,但 here() 方法中的 console.log() 永远不会触发。查看 chrome 中的网络选项卡,我可以看到它从不向 /broadcasting/auth.

发出请求

我也有后端所有设置来授权频道。实际上,我在 laravel 项目中有我的 inertiajs 应用程序,它使用相同的存在通道,具有相同的代码,并且它只是加入查找。我似乎无法让 Electron 应用程序正常工作。

谁能给我指出正确的方向?

看来我终于弄明白了。在做了更多调查之后,我发现 electron devtools 显然只是没有显示对授权路由的请求,因为我在我的 access_log 上做了一个 tail 并看到它实际上正在点击该路由。在访问日志中,我还可以看到我收到了 403 响应。

因为我需要我的 electron 应用程序和我的 inertia web 应用程序才能对这些通道进行身份验证,所以我将 BroadcastServiceProvider 启动方法更改为如下所示:

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

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

我还发现除非在 API 路由上添加 auth:sanctum 中间件,否则它不会工作。您还必须确保更新客户端以使用 /api/broadcasting/auth 路由而不是默认的 /broadcasting/auth.

进行这些更改后,我似乎可以很好地加入状态频道了。