问题描述
我有一个 Laravel API 后端,使用 Sanctum 进行身份验证。我使用 VueJS 作为前端和 Laravel Echo 来监听私人频道上的广播事件。在我的本地开发机器上,我可以毫无问题地连接和订阅私人频道。我可以在 Pusher 调试控制台中看到这一点。
但是,在我的生产服务器上,我可以看到在调试控制台中与 Pusher 建立了连接,但未进行订阅。我不知道这是为什么...这是我的配置文件如下:
'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,
中的 config/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);
}
);
在生产与本地开发之间有什么需要特别设置的吗? 我认为在环境中唯一不同的是生产服务器使用 SSL,而在本地开发中我没有。 如果有人有任何我可以尝试的想法,我将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)