【发布时间】:2018-10-05 15:05:19
【问题描述】:
我正在开发一个以 Vuetify (Vue.js) 作为前端的应用程序,它通过 api 与 laravel 后端服务器通信。
我正在尝试使用 laravel-echo-server 与 socket.io 一起制作一个通知系统。并在客户端中使用 laravel-echo。
我在客户端组件中用于测试连接是否有效的代码是:
// Needed by laravel-echo
window.io = require('socket.io-client')
let token = this.$store.getters.token
let echo = new Echo({
broadcaster: 'socket.io',
host: 'http://localhost:6001',
auth: {
headers: {
authorization: 'Bearer ' + token,
'X-CSRF-TOKEN': 'too_long_csrf_token_hardcoded'
}
}
})
echo.private('Prova').listen('Prova', () => {
console.log('IT WORKS!')
})
这是laravel-echo-server.json的代码
{
"authHost": "http://gac-backend.test",
"authEndpoint": "/broadcasting/auth",
"clients": [],
"database": "redis",
"databaseConfig": {
"redis": {},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"apiOriginAllow": {
"allowCors": false,
"allowOrigin": "",
"allowMethods": "",
"allowHeaders": ""
}
}
我尝试修改 apiOriginsAllow 没有成功。 事件已发送,我可以在 laravel-echo-server 日志中看到它:
Channel: Prova
Event: App\Events\Prova
但在那之后,当我访问包含连接代码的客户端组件时,我可以在 laravel-echo-server 日志中看到长错误跟踪和下一个错误:
The client cannot be authenticated, got HTTP status 419
如您所见,我在 laravel echo 客户端的 headers 中指定了 csrf 令牌和授权令牌。但它不起作用。
这是routes/channels.php的代码:
Broadcast::channel('Prova', function ($user) {
return true;
});
我只想监听一个事件,它是私有的还是公共的并不重要,因为当它工作时,我想把它放到 service worker 中。那么,我想如果它是公开的会更好。
- 如何在 laravel 项目中使用 laravel echo 客户端?
- 如果我制作私人事件并尝试将其监听到服务人员中会有问题吗?
【问题讨论】:
-
你已经解决了吗?我还想用 CORS 设置(Laravel 后端和 Vue 单页应用程序)实现 Echo。但是我的发展比你还差。我仍然不明白如何从事件中捕获返回的数据。如果我检查日志(laravel.log 文件),广播已通过有效负载成功发送,但在前端它也出现错误
No 'Access-Control-Allow-Origin' header。我已经用不记名令牌设置了标头,但仍然出现错误 -
更新,当我在 laravel 项目中设置 CORS 时,错误已经消失。现在,主要问题和你一样,如何在 laravel 项目之外使用 laravel echo 客户端:D
-
@MuhammadIzzuddinAlFikri 我写了答案stackoverflow.com/a/52256566/8950695。
-
419 是一个 CSRF 错误,使用没有将“_token”设置为 Laravel 的 CSRF 的 POST。您可以在中间件的 VerifyCSRFToken.php 中放置一个异常,或者更改您的身份验证策略并使用带有 Passport 或 JWT 的 API。
标签: php laravel events vue.js broadcast