Laravel 9 面向所有用户(访客和登录)的在线通道

问题描述 投票:0回答:2

类似的题目有很多,但没有一个解决方案是正确的。

我需要能够仅对特定状态通道的登录用户和访客进行“身份验证”。我怎样才能实现这个目标?

其余频道将作为标准仅对登录用户开放。

laravel broadcast pusher channel user-presence
2个回答
0
投票

前几天想出了这个,这只是为了一个游戏,所以你自己决定,但对我来说看起来不错。也许你可以给我一些安全反馈;D 我的情况是使用基于令牌的身份验证与 laravel sainttum。

如果你想使用状态通道,你还需要有一个访客的用户对象。

Broadcast::channel('{userRoom}', function ($user) {
    return ['id' => $user->id, 'name' => $user->name];
});

我的解决方案是除了为经过完全身份验证的用户提供常规用户表之外,还拥有一个来宾模型和 sql 表。就我而言,用户和访客模型都有一个房间属性,一个字符串,用户可以创建一个房间,并且访客可以加入该房间。

有一个单独的端点用于访客身份验证。我收集了名称、设备名称和房间,因为对于游戏来说这是有意义的,但关键是它是无密码的。该路由返回一个访客对象和一个承载令牌,访客可以使用它们来“验证”自己。

在 config/auth.php 中将新模型添加到用户提供程序:

      'providers' => [
        'users' => [
           'driver' => 'eloquent',
           'model' => App\Models\User::class,
          ],
          'guests' => [
            'driver' => 'eloquent',
            'model' => App\Models\Guest::class,
          ]
       ],

然后只需确保您的客人在设置推送器实例时提供不记名令牌即可。 JavaScript 会是这样的:

    var pusher = new Pusher('xxxxxxxxxxxxxx', {
      cluster: 'ap4',
      authEndpoint: "https://example.com/broadcasting/auth",
      auth: {
        headers: {
          Authorization: 'Bearer ' + token
        }
      }
    })

    var channel = pusher.subscribe('presence-xxxx');

    channel.bind("pusher:subscription_succeeded", function () {
      console.log("Subscription succeeded")
      console.log(channel.members.me)
      ...

我想只要确保您没有让客人接触到他们不应该接触的东西即可。这基本上就像拥有用户角色一样。


0
投票

您需要知道私有通道和在线通道仅适用于经过身份验证和授权的用户。

如果你想全部广播你需要使用公共频道

© www.soinside.com 2019 - 2024. All rights reserved.