Маршрут аутентификации широковещательной передачи Laravel просто возвращает истину

У меня установлен ключ-толкатель и он инициализирован в 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 "broadcasting / auth", он просто получает true в теле ответа.

Когда мои локальные контакты "вещают / авторизуются", он получает в ответ следующее:

{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 вместо ожидаемой аутентификации?


person eComEvo    schedule 27.07.2017    source источник
comment
Разве это не должно быть на route/channels.php? Ссылка   -  person Antonios Tsimourtos    schedule 15.01.2018
comment
@AntoniosTsimourtos, предназначенный для версий после Laravel 5.3.   -  person eComEvo    schedule 15.01.2018
comment
Это базовый вариант, но, думаю, стоит спросить: используете ли вы composer.lock, чтобы убедиться, что у вас одинаковые значения deps в обоих envs?   -  person Gustavo Straube    schedule 18.01.2018
comment
Я бы попытался выяснить, какой метод обрабатывает запрос broadcasting/auth, а затем отладить его.   -  person Camilo    schedule 19.01.2018


Ответы (3)


Если вы проверите PusherBroadcaster.php файл, вы увидите, что ответ может быть «смешанным».

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

Метод канала принимает два аргумента: имя канала и обратный вызов, который возвращает истину или ложь, указывающую, авторизован ли пользователь для прослушивания канала.

Это метод 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);
}

Краткое объяснение этого «запроса авторизации»:

BroadcastManager создайте экземпляры всех «доступных драйверов» (Pusher, Redis, Log и т. Д.) И создайте маршрут «аутентификации» (используя BroadcastController + метод аутентификации).

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

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

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

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

person Eduardo Stuart    schedule 19.01.2018
comment
Спасибо за подробное объяснение. Это указывает мне правильное направление, но почему $result в validAuthenticationResponse может быть логическим ответом от Pusher в разных средах? - person eComEvo; 22.01.2018
comment
BROADCAST_DRIVER=redis в вашем производстве .env файл VS BROADCAST_DRIVER=pusher локально. - person eightyfive; 30.11.2018

Изменить. Это документы из версии 5.5, здесь не применимы.

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

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

Broadcast::channel("servers.{id}", function (Authenticatable $user, $id) {
    return (int)$user->getAuthIdentifier() === (int)$id;
});
person Community    schedule 18.01.2018
comment
Это было бы странно, поскольку в документации сказано иное. - person Camilo; 19.01.2018
comment
Моя беда, я проглядел, он отметил версию 5.3 как версию. Это для 5.5. - person ; 19.01.2018

Проблема возникает из-за того, что вы не установили правильный BROADCAST_DRIVER в производственном .env файле (по умолчанию это redis).

# before
BROADCAST_DRIVER=redis

# after
BROADCAST_DRIVER=pusher
person eightyfive    schedule 30.11.2018