Маршрут аутентификации Laravel просто возвращает «true»

6

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

Когда мои локальные контакты "broadcasting/auth" получают это в ответ:

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"}

В моей BroadcastServiceProvider.php:

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

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

Что может привести к тому, что маршрут broadcast/auth просто вернется true вместо ожидаемого auth?

  • 0
    Разве это не должно быть на route/channels.php ? Ссылка на сайт
  • 0
    @AntoniosTsimourtos для версий после Laravel 5.3.
Показать ещё 2 комментария
Теги:
laravel-5.3
pusher

2 ответа

3
Лучший ответ

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

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

Метод канала принимает два аргумента: имя канала и обратный вызов, который возвращает 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 request":

BroadcastManager создать все "доступные драйверы" (Pusher, Redis, Log и т.д.) и создать маршрут "auth" (используя метод BroadcastController + authenticate).

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

  • Вызов маршрута "broadc.../auth".
  • BroadcastManager создаст правильный драйвер (в вашем случае Pusher)
  • PusherBroadcaster может генерировать исключение AccessDeniedHttpException, если пользователь не аутентифицирован ( "пользовательский сеанс" - Auth:: user() не определен /null ) и пытается получить доступ к частному (или присутствующему) каналу тип.
  • Если пользователь пытается получить доступ к каналу private/presence, и пользователь аутентифицирован (Auth:: check()), Laravel проверит, является ли auth. пользователь может получить доступ к каналу. (Проверьте: verifyUserCanAccessChannel метод).
  • После этого будет вызываться метод validAuthenticationResponse. Этот метод сделает запрос на толкатель с учетными данными пользователя и возвращает массив. Этот массив содержит ответ Pusher (socket auth: 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), который является строкой.

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

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

  • 0
    Спасибо за подробное объяснение. Это указывает мне правильное направление, но почему $result в validAuthenticationResponse может быть логическим ответом Pusher в разных средах?
  • 0
    BROADCAST_DRIVER=redis в вашем .env файле .env VS BROADCAST_DRIVER=pusher локально.
1

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

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

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

Broadcast::channel("servers.{id}", function (Authenticatable $user, $id) {
    return (int)$user->getAuthIdentifier() === (int)$id;
});
  • 0
    Это было бы странно, так как в документации сказано иначе.
  • 0
    Мой плохой, я упустил из виду он отметил 5.3 как версию. Это для 5.5.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню