У меня есть мой ключ-ключ и инициализирован в 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?
Если вы проверите файл 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", это произойдет:
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....).
$result
в validAuthenticationResponse
может быть логическим ответом Pusher в разных средах?
BROADCAST_DRIVER=redis
в вашем .env
файле .env
VS BROADCAST_DRIVER=pusher
локально.
Изменить. Это из документов версии 5.5, не применимых здесь.
Я думаю, что проблема может быть связана с использованием символа '*' в названии канала.
Я использую следующие как локальные, так и производственные:
Broadcast::channel("servers.{id}", function (Authenticatable $user, $id) {
return (int)$user->getAuthIdentifier() === (int)$id;
});
route/channels.php
? Ссылка на сайт