【问题标题】:Laravel Broadcast Authentication Not Using Standard User AuthLaravel 广播认证不使用标准用户认证
【发布时间】:2019-12-22 14:01:38
【问题描述】:

我现在已经花了几天的时间来解决这个问题。我正在使用这个 Laravel 包 Ohmybrew/Laravel-Shopify,它不使用标准的 Laravel 身份验证,因为它们有自己的中间件 auth.shop

我面临的问题是因为它不使用 $user 变量,因为默认 Auth 不存在,私有频道上 WebSockets 的广播身份验证始终是 403 未授权。

我尝试使用其他模型返回 true,但不起作用。

Broadcast::channel('shop.{id}', function ($user, $id) {
    $shop = ShopifyApp::shop();
    return (int) $shop->id === (int) $id;
});

我也尝试过只返回 true,不管是为了看到什么。也没有运气。

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

我什至弄乱了 PusherBroadcast.php 和 BroadcastManager 以删除抛出未验证的异常。这也不起作用。

我仍然在掌握 Laravel 作为一个整体的工作方式,所以不知道下一步该往哪里看。我已经阅读了自定义身份验证保护,但不确定它是否会起作用,因为包有自己的身份验证。

任何指导都将不胜感激,因为我有点无法尝试。似乎我为进入私人频道所做的任何事情都不起作用。

注意:值得一提的是,用于监听 WebSockets 的测试公共频道在当前设置下工作正常。只有私有通道身份验证不起作用。

更新:这是我收听频道的方式

            window.Echo.private('shop.{{ ShopifyApp::shop()->id }}')
                .listen('ScheduleProcessed', function(e) {
                    console.log(e);
                });

            window.Echo.channel(`test`) // Broadcast channel name
                .listen('BroadcastTestEvent', (e) => { // Message name
                        console.log(e); // The operation performed by the message, the parameter e is the data carried
                        alert("GOT S**T");
                    }
                );

测试通道的第二个工作正常。 “商店”频道没有,部分原因是当客户端尝试连接到私人频道时,广播/身份验证总是返回 403。

更新 2 似乎与默认身份验证需要使用 $request->user() 的事实有关,因为自定义身份验证根本不使用它,所以 $request->user() 是空的。

我已经读到绑定用户可能会起作用,但不是 100% 确定如何。

$request->merge(['user' => $user]);

//add this
$request->setUserResolver(function () use ($user) {
   return $user;
});

【问题讨论】:

  • 您能分享一下您尝试加入私人频道的 JavaScript 代码吗?
  • 嗨,@GeorgeHanson 添加了我用来监听套接字的 Laravel Echo 代码。问题是在网络选项卡中,broadcasting/auth 永远不会连接,因为它返回 403

标签: php laravel shopify phpwebsocket


【解决方案1】:

您可以为广播路由指定自己的中间件。像下面这样的东西应该可以工作:

Broadcast::routes(['middleware' => 'auth.shop']);

然后应该使用 Laravel-Shopify 包对用户进行身份验证。

如果您正在使用会话,您可能还需要指定您也想使用 web 中间件。

Broadcast::routes(['middleware' => ['web', 'auth.shop']]);

【讨论】:

  • 可悲的是,这仍然会导致 403 禁止错误。都试过了,有和没有网络路由。
  • 将 'web' 添加到 'middleware' 解决了我的问题。 Laravel Echo 和 Laravel-Websocket 没有显示任何错误,无法弄清楚出了什么问题。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2012-11-06
  • 2023-03-19
相关资源
最近更新 更多