React native pusher - подписка на частный канал с oauth паспорта laravel - детали ответа http

У меня постоянно возникает ошибка 500, когда я пытаюсь подписаться на частный канал с помощью pusher в моем собственном приложении для реагирования. Бэкэнд - это laravel с паспортным сервером oauth.

Я установил конечную точку аутентификации в настройках толкателя (http://url/broadcasting/auth)

Настройка push-native pusher

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

и маршрут авторизации широковещательной передачи в моем файле routes / channel.php с обратным вызовом, просто возвращающим true, но у меня все еще возникает ошибка 500

routes / channels.php

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

Вот класс события

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

Обратная связь с консоли, в которой говорится: «Pusher: не удалось получить информацию об авторизации из вашего веб-приложения: 500», не очень полезна для отладки. Так сложно указать, что не так. Если есть идеи?

Если нет, как я могу получить дополнительную информацию / обратную связь из HTTP-ответа из ответа толкача?

Спасибо.

РЕДАКТИРОВАТЬ:

После ответа ниже я обновил маршрут следующим образом. Обратите внимание: маршруты api / * не проходят проверку токена csrf, поскольку я исключил их из промежуточного программного обеспечения.

По-прежнему возникает ошибка 500. Есть ли способ получить более подробную информацию об ошибке, выданной Pusher? Было бы полезно получить еще несколько отзывов, чтобы понять, что происходит.

Новая конечная точка аутентификации:

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

ИЗМЕНИТЬ 2:

Я заставил его работать, удалив промежуточное ПО авторизации.

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

});

Но, очевидно, идея состоит в том, чтобы заставить пользователя сделать такой запрос, чтобы я мог дать надлежащую авторизацию.

Вот как я передаю свой токен аутентификации вызову pusher из react-native, но получаю ответ 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');

Все мои другие запросы на получение и отправку oauth с этим промежуточным программным обеспечением и токеном, указанными выше, правильно работают с моими вызовами axios.

Любая идея?


person sbkl    schedule 27.06.2017    source источник


Ответы (2)


Конечная точка аутентификации не может просто вернуть true. Он должен возвращать специальный токен, сгенерированный библиотекой pusher на вашем сервере. Клиент использует этот токен, чтобы продемонстрировать API толкателя, что ему разрешено подключаться к частному каналу. Ознакомьтесь с этой документацией.

person leesio    schedule 27.06.2017
comment
спасибо за ответ, но я все еще застрял. Я отредактировал свой пост в соответствии с вашим предложением (запрос включает в себя channel_name и socket_id, верно?). Но пока безуспешно. Когда я использую частный канал с javascript моего веб-приложения, нет проблем с аутентификацией на частном канале с начальной реализацией, которую я показал выше. Я считаю, что проблема в том, что веб-приложение не распознает, что пользователь вошел в систему, поскольку он использует реализацию oauth паспорта laravel. Есть предположения? - person sbkl; 27.06.2017
comment
Мне жаль. Я не понимаю, что вы имеете в виду, когда я использую частный канал с javascript моего веб-приложения, нет проблем с аутентификацией на частном канале с начальной реализацией, которую я показал выше. Можете ли вы проверить вкладку сети в консоли отладки в своем браузере, чтобы узнать, что возвращает ваша конечная точка аутентификации? - person leesio; 27.06.2017
comment
Когда я регистрируюсь с помощью обычного клиента javascript моего веб-сайта без сервера oauth. Для этого я использую Laravel Echo. Извините, если мое объяснение непонятно. вот документ, за которым я следил: laravel.com/docs/5.4/broadcasting# установка-laravel-echo - person sbkl; 27.06.2017
comment
Я заставил его работать, удалив промежуточное ПО oauth для аутентификации пользователя по запросу. Так что это первый хороший шаг. Но теперь проблема в том, что мне нужно иметь возможность аутентифицировать пользователя, чтобы я мог дать надлежащую авторизацию для доступа к каналу ... Не уверен, правильно ли я передаю токен oauth в запросе толкателя? - person sbkl; 28.06.2017
comment
Проблема была на моей стороне. То, как я получал токен, было неправильным, поэтому возникла проблема с аутентификацией. Итак, приведенный выше код работает. Спасибо за вашу помощь. - person sbkl; 29.06.2017
comment
@sbkl Я застрял в той же точке, что и ты. Хорошо, библиотека pusher возвращает токен после вызова / трансляции / аутентификации, но Laravel Echo не подписывается на канал в браузере. Вы знаете, как это решить? - person Mikel Granero; 12.04.2020

отредактируйте конечную точку авторизации следующим образом

        $user = auth()->user();

        if ($user) {
            $pusher = new Pusher('auth-key', 'secret', 'app_id');
            $auth= $pusher->socket_auth(Input::get('channel_name'), Input::get('socket_id'));
            $callback = str_replace('\\', '', $_GET['callback']);
            header('Content-Type: application/javascript');
            echo($callback . '(' . $auth . ');');
            return;
        }else {
            header('', true, 403);
            echo "Forbidden";
            return;
        }
person Bakhtiar    schedule 05.03.2019