Laravel广播认证路线只返回" true"

时间:2017-07-27 22:10:21

标签: php laravel laravel-5.3 pusher

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

Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Auth info required to subscribe to private-App.User.16"}}}

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

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

wss://ws.pusherapp.com/app/264P9d412196d622od64d?protocol=7&client=js&version=4.1.0&flash=false

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

当我的本地联系人" broadcast / auth"它在响应中得到了这个:

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"}

在我的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;
    });
}

什么可能导致broadcast/auth路由只返回true而不是预期的身份验证?

3 个答案:

答案 0 :(得分: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)
    );
}

只是给你另一个例子,这是在RedisBroadcast内。

if (is_bool($result)) {
    return json_encode($result);
}

关于此" auth请求的简短说明":

BroadcastManager实例化所有"可用的驱动程序" (Pusher,Redis,Log等),并创建" auth" route(使用BroadcastController + authenticate方法)。

当你打电话给" auth"时,会发生这种情况:

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

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

答案 1 :(得分:1)

修改这是5.5版文档,不适用于此。

我认为这个问题可能与使用' *'通道名称中的通配符。

我在本地和制作中使用以下内容:

Broadcast::channel("servers.{id}", function (Authenticatable $user, $id) {
    return (int)$user->getAuthIdentifier() === (int)$id;
});

答案 2 :(得分:0)

发生此问题是因为您没有在生产BROADCAST_DRIVER文件(默认为.env)中设置正确的redis

# before
BROADCAST_DRIVER=redis

# after
BROADCAST_DRIVER=pusher