使用java客户端验证laravel中的私有通道时出现问题

使用java客户端验证laravel中的私有通道时出现问题,java,php,laravel,pusher,laravel-passport,Java,Php,Laravel,Pusher,Laravel Passport,我想从服务器(使用laravel)向客户端(使用java)发送广播消息 我正在使用的内容 作为boradcast驱动程序 用于api身份验证的laravel passport 我在服务器端所做的工作 我已在.env文件中配置了推送器凭据 config/App.php文件中未注释的App\Providers\BroadcastServiceProvider::class行 在config/auth.php文件中,我添加了以下内容: “警卫”=>[ “网络”=>[ “驱动程序”=>“会话”, “提供

我想从服务器(使用laravel)向客户端(使用java)发送广播消息

我正在使用的内容

  • 作为boradcast驱动程序
  • 用于api身份验证的laravel passport
  • 我在服务器端所做的工作

  • 我已在
    .env
    文件中配置了推送器凭据
  • config/App.php
    文件中未注释的
    App\Providers\BroadcastServiceProvider::class
  • config/auth.php
    文件中,我添加了以下内容:
  • “警卫”=>[
    “网络”=>[
    “驱动程序”=>“会话”,
    “提供者”=>“用户”,
    ],
    “设备”=>[
    “驱动程序”=>“会话”,
    “提供程序”=>“设备”,
    ],
    “api”=>[
    “司机”=>“护照”,
    “提供程序”=>“设备”,
    ],
    ],
    “提供者”=>[
    “用户”=>[
    “司机”=>“雄辩”,
    'model'=>App\User::class,
    ],
    //使用设备表通过api guard进行身份验证
    “设备”=>[
    “司机”=>“雄辩”,
    'model'=>App\Device::class,
    ],
    ],
    
  • App\Providers\BroadcastServiceProvider
    class I中,向
    boot()
    函数添加了以下内容:
  • Broadcast::routes(['prefix'=>'api','middleware'=>'auth:api']);
    
  • routes/channels.php
    中,我添加了以下内容:
  • Broadcast::channel('device.{device\u id}',函数($device,$device\u id){
    返回$device->id===$device\u id;
    });
    
  • 通过运行
    php artisan make:event AdvertisementAdded
    创建了一个事件
    AdvertisementAdded
    ,added
    实现了ShouldBroadcast
    ,然后将以下内容添加到其
    broadcastOn()方法中:
  • 返回新的私有频道(“设备”。$this->device\u id);
    
    我在客户端所做的工作

    因为我现在正在测试,所以通过从邮递员发送登录请求,我获得了我的
    access\u token
    device\u id

    我将该accessToken复制到java客户端,并将其作为
    String
    存储在
    accessToken
    变量中,代码如下:

    String accessToken="持票人我认为这是一种非常有效的方法。我认为这是一种非常有效的方法2.这是一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,新的一个新的概念,新的概念,新的概念,新的概念,新的一个新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的一QM6ZMPFI0A3MP0CHJHE599OXB-NG2I4.中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的4个中国的4个中国的4个中国的一个中国的4个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的4个中国的8个中国的8个中国的8个中国的8个中国的8个中国的8个中国的8个中国的8个中国的中国RIBFRVOKGIH96WG89QBB_Ucpm8uBahX93FaOXhVLW0VJH2LQKRGW0BB5LS8QL5O”;
    字符串deviceId=“7”;
    Map authHeaders=new HashMap();
    authHeaders.put(“授权”,accessToken);
    HttpAuthorizer authorizer=新的HttpAuthorizer(“http://localhost:8000/api/broadcasting/auth");
    authorizer.setHeaders(authHeaders);
    PusherOptions options=新的PusherOptions();
    选项.setAuthorizer(authorizer).setCluster(PUSHER_CLUSTER);
    推送器推送器=新推送器(推送器应用键,选项);
    subscribePrivate(“专用设备”。+deviceId,新的PrivateChannelEventListener(){
    @凌驾
    public void onEvent(字符串channelName、字符串eventName、最终字符串数据){
    System.out.println(String.format(“通道[%s]上接收到的事件”,channelName));
    }
    @凌驾
    SubscriptionSucceeded上的公共无效(字符串){
    System.out.println(String.format(“订阅频道[%s]”,String));
    }
    @凌驾
    身份验证失败时的公共无效(字符串,异常excptn){
    System.out.println(字符串);
    }
    });
    pusher.connect(新的ConnectionEventListener(){
    @凌驾
    ConnectionStateChange(ConnectionStateChange)上的公共无效{
    System.out.println(“状态更改为”+change.getCurrentState()+
    “from”+change.getPreviousState());
    }
    @凌驾
    public void onError(字符串消息、字符串代码、异常e){
    System.out.println(“连接时出现问题!”);
    }
    });
    //保持主线程活动
    while(true){
    试一试{
    睡眠(1000);
    }捕捉(中断异常e){
    e、 printStackTrace();
    }
    }
    
    当运行上述代码时,它在控制台上输出以下内容:

    State changed to CONNECTING from DISCONNECTED
    State changed to CONNECTED from CONNECTING
    java.io.IOException: Server returned HTTP response code: 403 for URL: http://localhost:8000/api/broadcasting/auth
    
    我确信
    auth:api
    中间件在其他请求上的工作与我预期的一样

    下面是我的
    routes/api.php
    中的一个片段:

    Route::middleware('auth:api')->组(函数(){
    路由::前缀(‘广告’)->组(函数(){
    路由::get('/request','AdvertisementsController@getDeviceAdvertisements')
    ->名称('advisions.getDeviceAdvertisions');
    });
    });
    
    下面是邮递员对该路线的测试(使用与上面相同的访问令牌):

    下面是对来自邮递员的
    api/broadcasting/auth
    路由的测试(使用与上面相同的访问令牌):

    问题是什么?为什么
    auth:api
    中间件下的所有api路由都能正常工作,而不是
    api/broadcasting/auth
    route

    注意


    我尝试与公共频道合作,没有任何问题。

    经过一整天的搜索,终于解决了问题

    该错误发生在授权时