2017-07-27 20 views
6

Tôi đã đặt khóa pusher và khởi tạo trong Laravel 5.3. Khi tôi thử nghiệm nó trên môi trường địa phương của tôi, nó hoạt động. Khi tôi cố gắng chạy chính mã giống nhau trên môi trường sản xuất của chúng tôi, tôi nhận được lỗi này:Đường dẫn auth phát sóng Laravel chỉ trả về "true"

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

Tôi đã xác nhận khóa Pusher giống hệt nhau ở cả địa phương và sản xuất của tôi.

WS khởi trên cả các môi trường như nhau:

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

Sự khác biệt duy nhất mà tôi có thể thấy, là khi máy chủ sản xuất của chúng tôi tiếp xúc với Laravel "phát sóng/auth" tuyến đường, nó chỉ đơn giản nhận true trong cơ thể phản ứng.

Khi liên lạc địa phương của tôi "phát sóng/auth" nó được này trong phản ứng:

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"} 

Trong BroadcastServiceProvider.php tôi:

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; 
    }); 
} 

gì có thể gây ra các tuyến đường broadcast/auth trở về đơn giản true thay vì các auth dự kiến?

+0

Không được trên 'route/channels.php'? [Link] (https://github.com/laravel/laravel/blob/master/app/Providers/BroadcastServiceProvider.php) –

+0

@AntoniosTsimourtos dành cho các phiên bản sau Laravel 5.3. – eComEvo

+0

Điều này là cơ bản nhưng tôi đoán nó có giá trị yêu cầu: bạn đang sử dụng 'composer.lock' để đảm bảo rằng bạn có cùng một deps trong cả hai envs? –

Trả lời

2

Nếu bạn kiểm tra PusherBroadcaster.php tập tin, bạn sẽ thấy rằng câu trả lời có thể là "hỗn hợp".

Tôi nghĩ tài liệu chỉ nói về phát sóng mặc định.

The channel method accepts two arguments: the name of the channel and a callback which returns true or false indicating whether the user is authorized to listen on the channel.

Đây là phương pháp validAuthenticationResponse bên trong 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) 
    ); 
} 

Chỉ cần cung cấp cho bạn một ví dụ khác, đây là bên trong RedisBroadcast.

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

lời giải thích ngắn về vấn đề này "yêu cầu auth":

BroadcastManager thuyết minh tất cả "tài xế có sẵn" (Pusher, Redis, Log, vv), và tạo ra các "auth" tuyến đường (sử dụng BroadcastController + xác thực phương pháp).

Khi bạn gọi là "auth", điều này sẽ xảy ra:

  1. Call "broadc .../auth" lộ trình.
  2. BroadcastManager sẽ nhanh chóng lái xe phù hợp (trong trường hợp của bạn Pusher)
  3. PusherBroadcaster có thể ném một ngoại lệ AccessDeniedHttpException nếu người dùng không được chứng thực (phiên "người sử dụng" - Auth :: dùng() không được định nghĩa/null) và đang cố truy cập loại kênh riêng tư (hoặc hiện diện).
  4. Nếu người dùng đang cố gắng truy cập kênh private/presence và người dùng được xác thực (Auth :: check()), Laravel sẽ kiểm tra xem auth. người dùng có thể truy cập kênh. (Kiểm tra: verifyUserCanAccessChannel phương pháp).
  5. Sau đó, phương thức validAuthenticationResponse sẽ được gọi. Phương thức này sẽ yêu cầu pusher với thông tin người dùng và trả về một mảng. Mảng này chứa đáp ứng Pusher (socket auth: https://github.com/pusher/pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L586/Hiện diện Auth: https://github.com/pusher/pusher-http-php/blob/03d3417748fc70a889c97271e25e282ff1ff0ae3/src/Pusher.php#L615) là một chuỗi.

ngắn câu trả lời:

Soo .. Pusher đòi hỏi phản ứng auth này. Nếu không, bạn sẽ không thể kết nối/xác định người dùng (wss: //ws.pusherapp.com ....).

+0

Cảm ơn bạn đã giải thích chi tiết. Điều này chỉ cho tôi đi đúng hướng, nhưng tại sao '$ result' trong' validAuthenticationResponse' là một phản hồi boolean từ Pusher trong các môi trường khác nhau? – eComEvo

1

Chỉnh sửa Đây là tài liệu từ phiên bản 5.5, không áp dụng tại đây.

Tôi nghĩ vấn đề có thể xảy ra khi sử dụng ký tự đại diện '*' trong tên kênh.

tôi sử dụng sau đây trong cả hai địa phương và sản xuất:

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

Điều đó sẽ kỳ quặc vì [tài liệu] (https://laravel.com/docs/5.3/broadcasting#authorizing-channels) nói cách khác. – Camilo

+0

Tệ của tôi, tôi đã bỏ qua anh ta đã lưu ý 5.3 là phiên bản. Điều này là dành cho 5.5. – btl

Các vấn đề liên quan