在这里问了同样的问题后,我仍然有这个问题:从auth端点返回的JSON无效,但状态代码为200,没有响应。我看过类似的问题,并遵循建议:将我的广播驱动程序设置为"pusher",在App.config文件中取消注释"App/BBroadcastServiceProvider"类,在.env文件中将调试模式设置为false,等等。我也查看了pusher文档,但问题仍未解决。
我已经通过添加"/broacasting/auth/"auth端点和标头更新了以前的尝试,但仍然存在相同的错误。但我现在可以看到302重定向到auth路由,然后302重定向到登录路由,然后在laravel望远镜上看到200响应的仪表板,这是我以前没有看到的。因此,这向我表明,添加auth端点应该可以解决问题,但事实并非如此。
我还尝试设置并使用"/pusher/auth/"auth端点路由和控制器,但它给了我一个"加载资源失败:服务器响应状态为405(方法不允许("以及";错误:无法从身份验证端点检索身份验证字符串-已从/pusher/auth接收状态:405,但不是以前的无效json错误。我通过向控制器发出"get"请求得到了这个消息,但通过"post"请求得到的500内部服务器错误。我真的不知道哪个是正确的。
这是我的bootstrap.js文件:
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
// Enable pusher logging - don't include this in production
Pusher.logToConsole = true;
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
forceTLS: true,
authEndpoint: '/broadcasting/auth',
//authEndpoint: '/pusher/auth',
auth: {
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
}
}
});
这是我创建的一个pusherController:
public function pusherAuth(Request $request)
{
$key = getenv('PUSHER_APP_KEY');
$secret = getenv('PUSHER_APP_SECRET');
$app_id = getenv('PUSHER_APP_ID');
$pusher = new Pusher($key, $secret, $app_id);
$auth = $pusher->socket_auth($_GET('channel_name'), $_GET('socket_id'));
return response($auth, 200);
}
我现在知道我的vue前端文件应该接收并显示广播签出,这个问题与解决这个推送订阅错误有关。
任何帮助都将不胜感激。
检查.env
是否有正确的广播驱动程序:
BROADCAST_DRIVER=pusher
我终于解决了这个问题。正如错误消息所指出的,这个问题完全是身份验证问题。虽然我仍然不知道为什么内置的"/abroadcast/auth"端点不起作用,但我最初尝试通过创建"/pusher/auth/"进行身份验证的方式在设置路由和控制器时是错误的。
正确的路由设置应该是"post"并调用控制器,使用基于闭包的路由对我不起作用。我以前(见上文(对控制器的实现也是错误的。
这是起作用的控制器代码:
namespace AppHttpControllers;
use IlluminateHttpRequest;
use PusherPusher;
class PusherController extends Controller
{
/**
* Authenticates logged-in user in the Pusher JS app
* For private channels
*/
public function pusherAuth(Request $request)
{
$user = auth()->user();
$socket_id = $request['socket_id'];
$channel_name =$request['channel_name'];
$key = getenv('PUSHER_APP_KEY');
$secret = getenv('PUSHER_APP_SECRET');
$app_id = getenv('PUSHER_APP_ID');
if ($user) {
$pusher = new Pusher($key, $secret, $app_id);
$auth = $pusher->socket_Auth($channel_name, $socket_id);
return response($auth, 200);
} else {
header('', true, 403);
echo "Forbidden";
return;
}
}
}
这是最后一个bootstrap.js文件:
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
// Enable pusher logging - don't include this in production
Pusher.logToConsole = true;
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
forceTLS: true,
authEndpoint: '/pusher/auth',
auth: {
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
}
}
});
我在web.php中的路线代码:
Route::post('/pusher/auth', [PusherController::class, 'pusherAuth'])
->middleware('auth');
Pusher控制台日志:推送器::["事件记录",{"事件":"推送器内部:订阅成功","通道":"私人用户.3","数据":{}}]vendor.js:41325 Pusher::["没有对私人用户的回调。3对于Pusher:subscription_succeded"]
检查您的config/app.php
并确保AppProvidersBroadcastServiceProvider::class
不会从providers
列表中注释掉。
BroadcastServiceProvider::class
在其引导方法中包含Broadcast::routes();
,该方法为广播提供身份验证路由
npm install laravel-echo
需要安装laravel echo包来授权路由