2017-07-27 2 views
6

Ich habe meine Pusher-Taste innerhalb von Laravel 5.3 gesetzt und initialisiert. Wenn ich es in meiner lokalen Umgebung teste, funktioniert es. Wenn ich versuche, die genau die gleichen Code auf unserer Produktionsumgebung ausführen, bekomme ich diesen Fehler:Laravel Broadcasting Auth Route gibt einfach "true" zurück

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

ich die Pusher-Taste identisch ist bestätigt haben, sowohl auf meiner lokalen und Produktion.

Die WS auf beide initialisiert Umgebungen die gleiche:

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

Der einzige Unterschied, dass ich sehen kann, ist, dass, wenn unsere Produktionsserver kontaktiert die Laravel „Rundfunk/Auth“ Route, die er empfängt einfach true in der Antwort Körper.

Wenn meine Kontakte vor Ort "Rundfunk/Auth" es dies wird in der Antwort:

{auth: "22459d41299d6228d64d:df5d393fe37df0k3832fa5556098307f145d7e483c07974d8e7b2609200483f8"} 

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

Was könnte der broadcast/auth Weg führen zurückzukehren einfach true statt die erwartete Authentifizierung?

+0

Sollte das nicht auf "route/channels.php" sein? [Link] (https://github.com/laravel/laravel/blob/master/app/Providers/BroadcastServiceProvider.php) –

+0

@AntoniosTsimourtos das ist für Versionen nach Laravel 5.3. – eComEvo

+0

Das ist einfach, aber ich denke, es lohnt sich zu fragen: Verwenden Sie 'composer.lock', um sicherzustellen, dass Sie die gleichen Deps in beiden envs haben? –

Antwort

2

Wenn Sie PusherBroadcaster.php Datei überprüfen, werden Sie feststellen, dass die Antwort kann „gemischt“ werden.

Ich denke, die Dokumentation sagt nur über die Standard-Broadcast.

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.

Dies ist die Methode innerhalb validAuthenticationResponsePusherBroadcast.

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

Nur dir ein anderes Beispiel zu geben, dies innerhalb RedisBroadcast ist.

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

Kurze Erklärung über diese "Auth-Anforderung":

BroadcastManager instantiate alle "verfügbaren Treiber" (Pusher, Redis, Log, usw.), und erstellen Sie die "Auth" route (mit BroadcastController + authentifizieren Methode).

Wenn Sie "Auth" nennen, wird dies geschehen:

  1. Call "broadc .../Auth" route.
  2. BroadcastManager wird den richtigen Treiber (in Ihrem Fall Pusher) instanziiert
  3. PusherBroadcaster eine Ausnahme auslösen kann AccessDeniedHttpException, wenn der Benutzer nicht authentifiziert ist (die „Benutzersitzung“ - Auth :: Benutzer() nicht definiert/null) und versucht auf einen privaten (oder Präsenz-) Kanaltyp zuzugreifen.
  4. Wenn der Benutzer versucht, auf einen private/presence-Kanal zuzugreifen und der Benutzer authentifiziert wird (Auth :: check()), überprüft Laravel, ob die Auth. Benutzer kann auf den Kanal zugreifen. (Überprüfung: verifyUserCanAccessChannel Methode).
  5. Danach wird validAuthenticationResponse Methode aufgerufen werden. Diese Methode fordert Sie auf, mit den Benutzeranmeldeinformationen zu pushen und ein Array zurückzugeben. Dieses Array enthält Pusher-Antwort (Socket-Authentifizierung: 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), die eine Zeichenfolge ist.

Kurze Antwort:

Soo .. Pusher benötigen diese Auth Antwort. Andernfalls können Sie den Benutzer nicht verbinden/identifizieren (wss: //ws.pusherapp.com ....).

+0

Danke für die detaillierte Erklärung. Dies weist mich in die richtige Richtung, aber warum könnte '$ result' in' validAuthenticationResponse' eine boolesche Antwort von Pusher in verschiedenen Umgebungen sein? – eComEvo

1

Bearbeiten Dies ist aus der Version 5.5 docs, hier nicht anwendbar.

Ich denke, das Problem möglicherweise mit der Verwendung der '*' Wildcard im Namen des Kanals.

Ich verwende die folgenden beiden in lokalen und Produktion:

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

Das wäre seltsam, da die [Dokumentation] (https://laravel.com/docs/5.3/broadcasting#authorization-channels) etwas anderes sagt. – Camilo

+0

Mein schlechtes, ich habe übersehen, dass er 5.3 als die Version notierte. Dies ist für 5.5. – btl

Verwandte Themen