2017-07-27 116 views
6

Düğme anahtar kümem var ve Laravel 5.3 içinde başlatılmış. Yerel çevremde test ettiğimde işe yarıyor. Ben İtici tuşu hem benim yerel ve üretime aynıdır teyit ettikLaravel yayınlama auth rotası sadece "true" değerini döndürür

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

: Ben üretim ortamında tam aynı kod çalıştırmasına denediğinizde, bu hatayı alabilirsiniz. WS hem başlatır

aynı ortamları:

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

görebildiğim tek fark olduğunu ne zaman üretim sunucu rehber laravel "yayın/auth" rota, sadece içinde true alır cevap gövdesi. Benim BroadcastServiceProvider.php içinde

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"} 

:

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

Ne neden olabilir broadcast/auth rota basitçe true yerine dönmek için benim yerel rehber "yayın/auth" Bu yanıt olarak bu alır

beklenen auth?

+0

Bu, rota/channels.php'de olmamalı mıydı? [Link] (https://github.com/laravel/laravel/blob/master/app/Providers/BroadcastServiceProvider.php) –

+0

@AntoniosTsimourtos, Laravel 5.3'ten sonraki sürümler içindir. – eComEvo

+0

Bu temel ama sanırım sormaya değer: "composer.lock" kullanıyor musunuz, her iki envs de aynı deps var emin olmak için? –

cevap

2

:

yerel ve üretimde hem de aşağıdaki kullanın.

Belgelerin yalnızca varsayılan yayın hakkında olduğunu söylüyorum.

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.

Bu PusherBroadcast içinde validAuthenticationResponse yöntemdir.

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

Sadece bu iç RedisBroadcast olduğunu size başka örnek vermek gerekirse.

if (is_bool($result)) { 
    return json_encode($result); 
} 
bu "auth isteği" hakkında

Kısa açıklama: BroadcastController + kimlik doğrulaması kullanarak

BroadcastManager örneğini bütün "mevcut sürücüleri" (İtici, REDIS, giriş, vb) ve yaratmak "auth" rota (yöntem).

siz "auth" dediğimiz

, bu olacak:

  1. Çağrı "broadc .../auth" rota.
  2. BroadcastManager kullanıcı ("kullanıcı oturumunu" doğrulanmış değilse
  3. PusherBroadcaster istisna AccessDeniedHttpException atabilir (davanız İtici içinde ) uygun sürücüyü örneğini olacak - Auth :: kullanıcı() tanımlı değil/boş) ve özel (veya varlık) bir kanal türüne erişmeye çalışıyor.
  4. Kullanıcı bir private/presence kanalına erişmeye çalışıyorsa ve kullanıcı kimliği doğrulanmışsa (Auth :: check()), Laravel kimlik doğrulaması olup olmadığını kontrol edecektir. kullanıcı kanala erişebilir. (Kontrol: verifyUserCanAccessChannel yöntemi). Bu, validAuthenticationResponse yönteminden sonra çağrılacaktır. Bu yöntem, kullanıcı kimlik bilgileri ile itimat ve bir dizi döndürmek için bir istek yapacaktır. Bu dizi, bir dizi olan İtici yanıtı (soket 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) içerir.

Kısa cevap:

Soo .. İtici bu yetkilendirme yanıtını gerektirir. Aksi halde kullanıcıyı bağlayamaz/tanımlayamazsınız (wss: //ws.pusherapp.com ....).

+0

Detaylı açıklama için teşekkürler. Bu bana doğru yönde işaret ediyor, ama neden 'validAuthenticationResponse'de $ sonuç' farklı ortamlarda Pusher'den gelen bir yanıt olabilir? – eComEvo

1

Düzenle Bu, 5.5 sürüm belgesinden yok, burada geçerli değil.

Sorunun belki de '*' joker karakterini kullanarak kanalın adında olduğunu düşünüyorum. Eğer PusherBroadcaster.php dosyasını kontrol ederseniz, yanıtı "karma" olabileceğini göreceksiniz

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

[Dokümantasyon] (https://laravel.com/docs/5.3/broadcasting#authorizing-channels) aksi belirtilmedikçe bu tuhaf olurdu. – Camilo

+0

Benim kötü, gözden kaçan o notu olarak 5.3 belirtti. Bu 5.5 için. – btl