Laravel broadcasting auth route просто возвращает " true"

у меня есть набор ключей толкателя и инициализирован в Laravel 5.3. Когда я тестирую его в своей локальной среде, он работает. Когда я пытаюсь запустить тот же самый код в нашей рабочей среде, я получаю эту ошибку:

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

Я подтвердил, что ключ толкателя идентичен как на моем местном, так и на производстве.

WS инициализирует в обеих средах одно и то же:

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

единственная разница, которую я вижу, заключается в том, что когда наш производственный сервер контактирует с Laravel маршрут" broadcasting/auth", он просто получает true в тело ответа.

когда мои локальные контакты "broadcasting / 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 вместо ожидаемого auth?

2 ответов


если вы проверяете , вы увидите, что ответ может быть "смешанным".

я думаю, что документация говорит только о трансляции по умолчанию.

метод 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" (использование метода BroadcastController + authenticate).

когда вы вызываете "auth", это произойдет:

  1. вызов " broadc.../авт" маршрут.
  2. BroadcastManager создаст соответствующий экземпляр водитель (в вашем случае толкатель)
  3. PusherBroadcaster может выдать исключение AccessDeniedHttpException если пользователь не аутентифицирован ("сеанс пользователя" - Auth::user () не определен/null) и пытается получить доступ к частному (или присутствию) типу канала.
  4. если пользователь пытается получить доступ к private/presence канал и пользователь аутентифицируется (Auth:: check ()), Laravel проверит, если auth. пользователь может получить доступ к каналу. (Проверка:verifyUserCanAccessChannel метод.)
  5. после этого, validAuthenticationResponse метод будет вызван. Этот метод сделает запрос на толкатель с учетными данными пользователя и вернет массив. Этот массив содержит ответ толкателя (Socket auth: https://github.com/pusher/pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L586 / Наличие Auth: https://github.com/pusher/pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L615) который является строка.

короткий ответ::

соо.. Толкатель требует этого ответа auth. В противном случае вы не сможете подключиться/идентифицировать пользователя (wss: / / ws.толкач.com....).


редактировать Это из версии 5.5 docs, не применимо здесь.

Я думаю, что проблема может быть с использованием подстановочного знака " * " в имени канала.

Я использую следующее как в местном, так и в производственном:

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