Laravel / broadcast / auth总是因403错误而失败

时间:2017-01-18 20:33:07

标签: php laravel pusher laravel-echo

我最近钻研了Laravel 5.3的Laravel-Echo和Pusher组合。我已经成功建立了公共频道,然后转向私人频道。我在Laravel从/ broadcast / auth路由返回403时遇到了麻烦,无论我做什么尝试授权操作(包括使用简单的返回true语句)。谁能告诉我我做错了什么?

应用/提供者/ BroadcastServiceProvider.php:     

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Broadcast::routes();

        /*
         * Authenticate the user's personal channel...
         */
        Broadcast::channel('App.User.*', function ($user, $userId) {
            return true;
        });
    }
}

resources/assets/js/booststrap.js:
 import Echo from "laravel-echo"

 window.Echo = new Echo({
     broadcaster: 'pusher',
     key: 'My-Key-Here'
 });

window.Echo.private('App.User.1')
    .notification((notification) => {
        console.log(notification.type);
    });

我可以在Pusher调试控制台中看到事件及其有效负载,一旦它到达认证路由就会失败。

9 个答案:

答案 0 :(得分:6)

使用Laravel版本的错误403 / broadcast / auth> 5.3& Pusher,您需要使用

更改resources / assets / js / bootstrap.js中的代码
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your key',
    cluster: 'your cluster',
    encrypted: true,
    auth: {
        headers: {
            Authorization: 'Bearer ' + YourTokenLogin
        },
    },
});

在app / Providers / BroadcastServiceProvider.php中改变

Broadcast::routes()

Broadcast::routes(['middleware' => ['auth:api']]);

Broadcast::routes(['middleware' => ['jwt.auth']]); //if you use JWT

它对我有用,希望对你有帮助。

答案 1 :(得分:2)

我将socket.io与redis配对,即使在/ broadcasting / auth路由上没有任何身份验证中间件,也存在403错误的问题。只是在laracasts lesson之后,我才发现仅频道授权是不够的,无论使用何种方式使用默认的laravel auth或某些令牌算法(jwt或其他任何令牌)来进行身份验证和获取用户,总应该有用户。

经过身份验证的用户将自动解析,并作为第一个参数传递到route / channels.php文件中的闭包函数,因此您可以检查当前登录用户的通道可用性 enter image description here

答案 2 :(得分:1)

我通过创建频道路线来解决它。

在routes-> channels.php

中创建授权频道
Exception in thread "main" java.lang.NoClassDefFoundError: org/reflections/Configuration
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigNamespace.getChild(ConfigNamespace.java:68)
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigElement.parse(ConfigElement.java:180)
    at com.thinkaurelius.titan.diskstorage.configuration.BasicConfiguration.getAll(BasicConfiguration.java:80)
    at com.thinkaurelius.titan.graphdb.configuration.GraphDatabaseConfiguration.<init>(GraphDatabaseConfiguration.java:1327)
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:94)
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:74)
    at com.metlife.titandb.testTitan$.getTitanConnection(testTitan.scala:330)
    at com.metlife.titandb.testTitan$.createSchema(testTitan.scala:206)
    at com.metlife.titandb.testTitan$.main(testTitan.scala:340)
    at com.metlife.titandb.testTitan.main(testTitan.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
    Caused by: java.lang.ClassNotFoundException: org.reflections.Configuration
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

请参阅文档:https://laravel.com/docs/5.4/broadcasting#authorizing-channels

谢谢

答案 3 :(得分:1)

检查您如何授权自己的频道。根据您的设置,这可能会有所帮助。使用以下更新您的BroadcastServiceProvider:

d2c2408

添加用于Laravel Passport的Auth API中间件。

答案 4 :(得分:0)

对我有用的是使用Laravel Echo包的 private 方法: https://laravel.com/docs/5.3/notifications#listening-for-notifications

Echo.private('App.User.1')
  .notification((notification) => {
  console.log(notification.type);
});

答案 5 :(得分:0)

在我的情况下,问题是用户ID错误:

Echo.private('user.'+CURRENT_USER_ID_HERE)

答案 6 :(得分:0)

如果您不再登录,可能会发生这种情况。请确保您实际登录Laravel应用程序并且当前会话尚未过期。

我重新登录,它对我有用。

答案 7 :(得分:0)

以防万一有人在最新的Laravel 5.7中遇到相同的问题,对我有用的好的解决方案是在返回之前或如下所示的返回上检查每个通道中的身份验证。

Broadcast::channel('user.*', function ($user) {
return Auth::check();

});

Broadcast::channel('conversation.{id}', function ($user, $conversationId) {
        Auth::check();
    return $user->isInConversation(Conversation::find($conversationId));
});

这样,它可以与播放包括用户在内的任何事件的任何频道一起使用。

我希望它可以帮助其他人。

答案 8 :(得分:-1)

-- reinstalling websockets
-- php artisan optimize:clear