React native pusher-专用通道订阅与laravel passport oauth-http响应详细信息

React native pusher-专用通道订阅与laravel passport oauth-http响应详细信息,laravel,react-native,httpresponse,pusher,laravel-passport,Laravel,React Native,Httpresponse,Pusher,Laravel Passport,当我尝试在react原生应用程序中使用pusher订阅私人频道时,我一直出现500个错误。后端是带有passport oauth服务器的laravel 我已经在推送器设置中设置了身份验证端点 反应本机推送装置 我的routes/channel.php文件中的广播授权路由和回调仅返回true,但我一直有一个500错误 routes/channels.php 这是事件类 编辑2: 我通过删除授权中间件使其正常工作 Route::post('api/authtest', function() {

当我尝试在react原生应用程序中使用pusher订阅私人频道时,我一直出现500个错误。后端是带有passport oauth服务器的laravel

我已经在推送器设置中设置了身份验证端点

反应本机推送装置

我的routes/channel.php文件中的广播授权路由和回调仅返回true,但我一直有一个500错误

routes/channels.php

这是事件类

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

});
但显然,我们的想法是能够让用户提出这样的请求,这样我就可以给予适当的授权

下面是我如何将我的auth令牌传递给来自react native的pusher调用,但我得到了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 get和post请求都能在axios调用中正常工作


有什么想法吗?

身份验证端点不能简单地返回true。它必须返回由服务器上的推送程序库生成的特殊令牌。客户端使用此令牌向推送器API演示允许连接到专用通道。请检查此项。

身份验证端点不能简单地返回true。它必须返回由服务器上的推送程序库生成的特殊令牌。客户端使用此令牌向推送器API演示允许连接到专用通道。检查此项。

像这样编辑您的身份验证端点

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

像这样编辑您的身份验证端点

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

谢谢你的回答,但我还是被卡住了。我已经编辑了我的帖子,实现了你的建议。请求包括频道名称和套接字id right?。但到目前为止运气不好。当我将私有通道与我的web应用程序的javascript一起使用时,使用上面所示的初始实现在私有通道上进行身份验证没有问题。我认为问题在于webapp无法识别有用户登录,因为它使用的是laravel passport oauth实现。有什么想法吗?对不起。我不明白你们的意思,当我用我的web应用程序的javascript使用私有通道时,用我上面展示的初始实现在私有通道上进行身份验证没有问题。当我在没有oauth服务器的情况下向我的网站的常规javascript客户端注册时,您是否能够检查浏览器中调试控制台的“网络”选项卡以查看auth端点返回的内容。为此,我使用了Laravel Echo。对不起,我的解释不清楚。下面是我遵循的文档:我删除了oauth中间件,以便对请求进行用户身份验证,从而使其正常工作。这是好的第一步。但现在的问题是,我需要能够获得用户身份验证,这样我才能对通道的访问给予适当的授权。。。不确定我是否在推送请求中正确传递了oauth令牌?问题出在我这边。我获取令牌的方式是错误的,因此存在身份验证问题。所以上面的代码是有效的。谢谢你的帮助。谢谢你的回答,但我还是卡住了。我已经编辑了我的帖子,实现了你的建议。请求包括频道名称和套接字id right?。但到目前为止运气不好。当我将私有通道与我的web应用程序的javascript一起使用时,使用上面所示的初始实现在私有通道上进行身份验证没有问题。我认为问题在于webapp无法识别有用户登录,因为它使用的是laravel passport oauth实现。有什么想法吗?对不起。我不明白你们的意思,当我用我的web应用程序的javascript使用私有通道时,用我上面展示的初始实现在私有通道上进行身份验证没有问题。当我在没有oauth服务器的情况下向我的网站的常规javascript客户端注册时,您是否能够检查浏览器中调试控制台的“网络”选项卡以查看auth端点返回的内容。为此,我使用了Laravel Echo。对不起,我的解释不清楚。下面是我遵循的文档:我删除了oauth中间件,以便对请求进行用户身份验证,从而使其正常工作。这是好的第一步。但现在的问题是,我需要能够获得用户身份验证,这样我才能对通道的访问给予适当的授权。。。不确定我是否在推送请求中正确传递了oauth令牌?问题出在我这边。我获取令牌的方式是错误的,因此存在身份验证问题。所以上面的代码是有效的。谢谢你的帮助。
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]);

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