0

Je continue d'avoir 500 erreur lorsque j'essaie de m'abonner à un canal privé avec poussoir dans mon application native réagir. Back end est laravel avec le serveur de passeport oauth.React natif poussoir - abonnement de canal privé avec laravel passeport oauth - détail de la réponse http

J'ai installé mon point final auth dans mes paramètres de poussoir (http://url/broadcasting/auth)

réagir natif configuration pousseur

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

et l'itinéraire d'autorisation de diffusion dans mes itinéraires/fichier channel.php avec un rappel retournant simplement vrai mais je continue à avoir une erreur de 500

routes/channels.php

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

Voici la classe d'événements

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

La rétroaction de la console en disant: "Pusher: Impossible d'obtenir auth informations de votre webapp: 500" est pas vraiment utile pour debbuging. Tellement difficile de souligner ce qui ne va pas. Si vous avez une idée? Si non, comment pourrais-je obtenir plus d'informations/commentaires de la réponse http de la réponse poussoir?

Merci.

EDIT:

Après la réponse ci-dessous, je l'ai mis à jour la route comme suit. Veuillez noter que les routes api/* n'ont pas de vérification de jeton csrf car je les ai exclues du middleware.

Vous obtenez toujours une erreur 500. Un moyen d'avoir plus de détails sur l'erreur lancée par Pusher? Il serait utile d'avoir plus de rétroaction pour comprendre ce qui se passe.

Nouveau point d'extrémité:

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:

je l'ai fait travailler en supprimant le middleware d'autorisation.

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

}); 

Mais évidemment, l'idée est de pouvoir demander à l'utilisateur de faire une telle demande afin que je puisse donner l'autorisation appropriée.

Voici comment je passe mon jeton d'authentification à l'appel poussé de réac-native mais j'obtiens une réponse 401.

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

Tous mes autres oauth obtenir et demandes de poste avec ce middleware et jeton donné ci-dessus fonctionnent correctement avec mes appels Axios.

Une idée?

Répondre

1

Le point d'extrémité d'authentification ne peut pas simplement renvoyer true. Il doit renvoyer un jeton spécial généré par la bibliothèque Pusher sur votre serveur. Le client utilise ce jeton pour démontrer à l'API Pusher qu'il est autorisé à se connecter au canal privé. Découvrez ce documentation.

+0

merci pour votre réponse, mais je suis toujours coincé. J'ai modifié mon message en implémentant votre suggestion (la requête inclut le nom de la chaîne et le droit de la socket?). Mais pas de chance jusqu'à présent. Lorsque j'utilise un canal privé avec le javascript de mon application web, aucun problème pour m'authentifier sur un canal privé avec l'implémentation initiale que j'ai montrée ci-dessus. Je crois que le problème est que la webapp ne reconnaît pas qu'il y a un utilisateur connecté car il utilise la mise en œuvre de passeport laraut oauth. Des pensées? – sbkl

+0

Je suis désolé. Je ne comprends pas ce que vous entendez par "Quand j'utilise une chaîne privée avec le javascript de mon application web, aucun problème pour m'authentifier sur une chaîne privée avec l'implémentation initiale que j'ai montrée ci-dessus." Êtes-vous capable de vérifier l'onglet réseau de la console de débogage dans votre navigateur pour voir ce qui est retourné par votre point de terminaison auth? – leesio

+0

Lorsque je m'inscris avec le client javascript habituel de mon site sans serveur oauth. Pour cela, j'utilise Laravel Echo. Désolé si mon explication n'est pas claire. Voici le document que j'ai suivi: https://laravel.com/docs/5.4/broadcasting#installing-laravel-echo – sbkl