Laravel广播认证路线只返回"真实"

eCo*_*Evo 7 php laravel pusher laravel-5.3

我有我的推杆键设置并在Laravel 5.3中初始化.当我在我的本地环境中测试时,它可以工作.当我尝试在生产环境中运行完全相同的代码时,我收到此错误:

Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Auth info required to subscribe to private-App.User.16"}}}
Run Code Online (Sandbox Code Playgroud)

我已经确认Pusher键在我的本地和制作上是相同的.

WS在两个环境中初始化相同:

wss://ws.pusherapp.com/app/264P9d412196d622od64d?protocol=7&client=js&version=4.1.0&flash=false
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是,当我们的生产服务器联系Laravel"广播/验证"路由时,它只是true在响应正文中接收.

当我的本地联系人"广播/认证"时,它会在响应中得到:

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"}
Run Code Online (Sandbox Code Playgroud)

我的内心BroadcastServiceProvider.php:

public function boot()
{
    Broadcast::routes();

    // Authenticate the user's personal channel.
    Broadcast::channel('App.User.*', function (User $user, $user_id) {
        return (int)$user->id === (int)$user_id;
    });
}
Run Code Online (Sandbox Code Playgroud)

什么可能导致broadcast/auth路线返回true而不是预期的auth?

Edu*_*art 4

如果您检查PusherBroadcaster.php文件,您将看到响应可以是“混合的”。

我认为文档仅说明了默认广播。

Channel 方法接受两个参数:通道名称和回调,该回调返回 true 或 false,指示用户是否有权收听该通道。

这就是validAuthenticationResponse里面的方法PusherBroadcast

/**
 * Return the valid authentication response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $result
 * @return mixed
 */
public function validAuthenticationResponse($request, $result)
{
    if (Str::startsWith($request->channel_name, 'private')) {
        return $this->decodePusherResponse(
            $this->pusher->socket_auth($request->channel_name, $request->socket_id)
        );
    }

    return $this->decodePusherResponse(
        $this->pusher->presence_auth(
            $request->channel_name, $request->socket_id, $request->user()->getAuthIdentifier(), $result)
    );
}
Run Code Online (Sandbox Code Playgroud)

再举一个例子,这是在里面RedisBroadcast

if (is_bool($result)) {
    return json_encode($result);
}
Run Code Online (Sandbox Code Playgroud)

关于此“身份验证请求”的简短说明:

BroadcastManager实例化所有“可用驱动程序”(Pusher、Redis、Log 等),并创建“auth”路由(使用 BroadcastController + 验证方法)。

当你调用“auth”时,会发生这种情况:

  1. 调用“broadc.../auth”路线。
  2. BroadcastManager 将实例化正确的驱动程序(在您的情况下为 Pusher
  3. PusherBroadcasterAccessDeniedHttpException如果用户未经过身份验证(“用户会话” - Auth::user() 未定义/为空)并且尝试访问私有(或存在)通道类型,则可能会引发异常。
  4. 如果用户尝试访问private/presence频道并且用户已通过身份验证(Auth::check()),Laravel 将检查 auth. 用户可以访问该频道。(检查:verifyUserCanAccessChannel方法)。
  5. 之后,validAuthenticationResponse方法将被调用。此方法将使用用户凭据向推送器发出请求并返回一个数组。该数组包含 Pusher 响应(套接字身份验证:https://github.com/pusher/pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L586 / 存在身份验证: https: //github.com/pusher/ Pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L615)这是一个字符串。

简短回答

Soo.. Pusher 需要此身份验证响应。否则您将无法连接/识别用户(wss://ws.pusherapp.com ....)。