0

Ich habe immer 500 Fehler, wenn ich versuche, einen privaten Kanal mit Pusher in meiner nativen App zu reagieren. Back-End ist Laravel mit Pass oauth Server.React native Pusher - Privatkanal Abonnement mit Laravel Pass oauth - http Antwort Detail

Ich habe meinen Setup Auth Endpunkt in meinen Schubeinstellungen (http://url/broadcasting/auth)

reagieren-native Drücker Setup

import Pusher from 'pusher-js/react-native'; 

Pusher.logToConsole = true; 

var pusher = new Pusher('pusher-key', { 
    authEndpoint: 'http://url.com/broadcasting/auth', 
    cluster: 'ap1', 
    encrypted: true 
}); 

var channel = pusher.subscribe('private-order'); 

channel.bind('App\\Events\\Order\\SiteHasAnsweredCheckIn', function(data) { 
    console.log('ok : ' + data); 
}); 

und der Broadcast-Zulassung Weg in meinen Routen/channel.php Datei mit ein Callback einfach zurück wahr, aber ich habe immer eine 500 Fehler

Routen/Kanäle.php

Broadcast::channel('order', function() { 
    return true; 
}); 

Hier ist die Ereignisklasse

<?php 

namespace App\Events\Order; 

use App\Site; 
use App\User; 
use Illuminate\Broadcasting\Channel; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Broadcasting\PrivateChannel; 
use Illuminate\Broadcasting\PresenceChannel; 
use Illuminate\Foundation\Events\Dispatchable; 
use Illuminate\Broadcasting\InteractsWithSockets; 
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 

class SiteHasAnsweredCheckIn implements ShouldBroadcast 
{ 
    use Dispatchable, InteractsWithSockets, SerializesModels; 

    public $site; 

    public $user; 

    public $checkInConfirmed; 

    /** 
    * Create a new event instance. 
    * 
    * @param Site $site 
    * @param User $user 
    * @param $checkInConfirmed 
    */ 
    public function __construct(Site $site, User $user, $checkInConfirmed) 
    { 
     $this->site = $site; 

     $this->user = $user; 

     $this->checkInConfirmed = $checkInConfirmed; 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return new PrivateChannel('order'); 
    } 
} 

Das Feedback von der Konsole zu sagen: "Pusher: nicht Auth Informationen aus Ihrem Webapp bekommen kann: 500" für debbuging nicht wirklich nützlich ist. Es ist so schwer, darauf hinzuweisen, was falsch ist. Wenn Sie eine Idee haben?

Wenn nicht, wie könnte ich mehr Informationen/Feedback von der HTTP-Antwort von der Pusher-Antwort erhalten?

Vielen Dank.

EDIT:

Nach der Antwort unten habe ich die Route wie folgt aktualisiert. Bitte beachten Sie, dass api/* Routen keine csrf Token Prüfung haben, da ich sie von der Middleware ausgeschlossen habe.

Erhalten Sie immer noch einen 500 Fehler. Gibt es eine Möglichkeit, mehr über den von Pusher geworfenen Fehler zu erfahren? Es wäre nützlich, mehr Feedback zu haben, um zu verstehen, was vor sich geht.

Neue Auth Endpoint:

Route::post('api/authtest', function() { 

    $pusher = new Pusher(config('broadcasting.connections.pusher.key'), config('broadcasting.connections.pusher.secret'), config('broadcasting.connections.pusher.app_id')); 
    echo $pusher->socket_auth($_POST[request()->channel_name], $_POST[request()->socket_id]); 

})->middleware('auth:api'); 

EDIT 2:

Ich habe es durch Entfernen der Middleware der Genehmigung arbeiten.

Route::post('api/authtest', function() { 

    $pusher = new Pusher(config('broadcasting.connections.pusher.key'), config('broadcasting.connections.pusher.secret'), config('broadcasting.connections.pusher.app_id')); 
    echo $pusher->socket_auth($_POST[request()->channel_name], $_POST[request()->socket_id]); 

}); 

Aber offensichtlich ist die Idee, in der Lage zu sein, den Benutzer zu bekommen, der solch eine Anfrage macht, damit ich richtige Erlaubnis geben kann.

Hier ist, wie ich meine Authentifizierungs-Token an den Pusher-Aufruf von react-native übergeben, aber ich bekomme eine 401 Antwort.

let token = 'auth_access_token_taken_from_database'; 

var pusher = new Pusher('pasher_key', { 
    authEndpoint: 'http://url.com/api/authtest', 
    auth: { 
     headers: { 
      'Accept': 'application/json', 
      'Authorization': 'Bearer ' + token 
     } 
    }, 
    cluster: 'ap1', 
    encrypted: true 
}); 

var channel = pusher.subscribe('private-order'); 

All meine andere oauth bekommen und Post-Anfragen mit dieser Middleware und Token oben angegebenen richtig funktionieren mit meinem axios Anruf.

Irgendeine Idee?

Antwort

1

Der Authentifizierungsendpunkt kann nicht einfach true zurückgeben. Es muss ein spezielles Token zurückgeben, das von der Pusher-Bibliothek auf Ihrem Server generiert wurde. Der Client verwendet dieses Token, um der Pusher-API zu demonstrieren, dass eine Verbindung mit dem privaten Kanal möglich ist. Überprüfen Sie diese documentation.

+0

danke für deine antwort, aber ich bin immer noch fest. Ich habe meinen Post bearbeitet, der deinen Vorschlag implementiert (die Anfrage schließt channel_name und und die socket_id richtig ein?). Aber bisher kein Glück. Wenn ich privaten Kanal mit dem Javascript meiner Webanwendung benutze, kein Problem, auf privatem Kanal mit der anfänglichen Implementierung zu bestätigen, die ich oben gezeigt habe. Ich glaube, das Problem ist, dass die Webanwendung nicht erkennt, dass ein Benutzer eingeloggt ist, da er die Implementierung von Laravel-Pass oauth verwendet. Irgendwelche Gedanken? – sbkl

+0

Es tut mir leid. Ich verstehe nicht, was du meinst "Wenn ich privaten Kanal mit dem Javascript meiner Web-App verwende, kein Problem auf dem privaten Kanal mit der anfänglichen Implementierung zu authentifizieren, die ich oben gezeigt habe." Können Sie die Netzwerkregisterkarte der Debug-Konsole in Ihrem Browser überprüfen, um zu sehen, was von Ihrem Authentifizierungsendpunkt zurückgegeben wurde? – leesio

+0

Wenn ich mich mit dem regulären Javascript-Client meiner Website ohne OAuth-Server anmelde. Dafür benutze ich Laravel Echo. Entschuldigung, wenn meine Erklärung nicht klar ist. Hier ist das Dokument, dem ich gefolgt bin: https://laravel.com/docs/5.4/broadcasting#installing-laravel-echo – sbkl

Verwandte Themen