首页 > 解决方案 > Laravel Echo 已连接但未订阅 prod 服务器上的 Pusher Private Channel

问题描述

我有一个使用 Sanctum 进行身份验证的 Laravel API 后端。我使用 VueJS 作为 Laravel Echo 的前端来监听私人频道上的广播事件。在我的本地开发机器上,我可以毫无问题地连接并订阅私人频道。我可以在 Pusher 调试控制台中看到这一点。

但是,在我的产品服务器上,我可以看到在调试控制台中与 Pusher 建立了连接,但没有进行订阅。我不知道为什么会这样......这是我的配置文件如下:

配置/广播.php

'connections' => [
    'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
            'cluster' => 'eu',
            // 'useTLS' => true
        ],

routes/channels.php - 我返回 true 以确保它不是导致它的身份验证

Broadcast::channel('calendar.{id}', function ($user, $id) {
    return true;
});

我已取消注释App\Providers\BroadcastServiceProvider::class,inconfig/app.php并添加了 Broadcast::route 函数以使用 sanctum。

public function boot()
{
   Broadcast::routes(['middleware' => ['auth:sanctum']]);
   require base_path('routes/channels.php');
}

我在 main.js 中的前端配置(baseURL 是我们 API 的 URL,例如:https://site.oursite.com

window.Pusher = require("pusher-js");
window.Echo = new Echo({
  broadcaster: "pusher",
  key: "my key",
  cluster: "eu",
  encrypted: true,
  authEndpoint: config.get("baseUrl") + "/broadcasting/auth",
  auth: {
    headers: {
      authorization: `Bearer ${token.getToken(1)}`,
    },
  },
});

axios.defaults.withCredentials = true;
axios.defaults.baseURL = config.get("baseUrl");
axios.get("/sanctum/csrf-cookie");

let socketId = false;
window.Echo.connector.pusher.connection.bind("connected", function() {
  socketId = window.Echo.socketId();
});

//set the socket ID on each axios request
axios.interceptors.request.use((conf) => {
  // pusher socket
  if (socketId) conf.headers["X-Socket-ID"] = socketId; 

  // add auth token
  conf.baseURL = config.get("baseUrl") + "/api/";
  if (token.hasToken(1))
    conf.headers.authorization = `Bearer ${token.getToken(1)}`;

  return conf;
});

和听众:

window.Echo.private(`calendar.${calendarId}`).listen(
  ".entry.created",
  (payload) => {
    console.log(payload);
  }
);

在生产与本地开发方面是否需要设置任何具体内容?我认为在环境中唯一不同的是 prod 服务器使用 SSL,而在本地 dev 上我没有。如果有人有任何我可以尝试的想法,我将不胜感激。

标签: laravelvue.jsechopusherlaravel-echo

解决方案


推荐阅读