laravel - 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 上我没有。如果有人有任何我可以尝试的想法,我将不胜感激。
解决方案
推荐阅读
- label - 结合来自 2 个不同指标的标签值:Grafana
- python - 无法使用请求在网页中保存表单的某些字段
- druid - Superset 可以可视化从 REST API 调用返回的数据吗?
- vbscript - VBS在文本文件中写入多行
- xpath-2.0 - xpath 2.0 中缺少 let 的解决方法?
- laravel - 如何编写代码将多个数据插入数据库 Laravel
- php - 发生数据库错误错误号:1048
- dialogflow-es - 如何在对话流实现中将多个意图映射到一个处理程序?
- javascript - 处理放置在对象内的数组连接的更好方法
- android - APK 在 Android Studio 中安装后保持停止