web-dev-qa-db-ja.com

Laravel / broadcasting / authが403エラーで常に失敗する

私は最近、Laravel 5.3のLaravel-EchoとPusherの組み合わせについて詳しく調べました。パブリックチャネルの設定に成功し、プライベートチャネルに移行しました。Laravel/broadcasting/authルートから403を返しますが、アクションを承認するために何をしようとしても(単純なreturn trueステートメントの使用まで)、誰かが私が間違っていることを教えてもらえますか?

App/Providers/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デバッグコンソールで確認できます。認証ルートに到達すると、失敗します。

10
user2321275

エラー403/broadcasting/auth with Laravel version> 5.3&Pusher、あなたはコードを変更する必要がありますresources/assets/js/bootstrap.js with

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

それは私のために働きました、そしてそれがあなたを助けることを願っています。

8
Alex

/ broadcasting/authルート上に認証ミドルウェアがなかったにもかかわらず、socket.ioをredisとペアにして、403エラーで問題が発生しました。 whatchingの後のみ laracastsレッスン チャネル認証だけでは十分ではないことがわかりました。デフォルトのlaravel authまたは何らかのトークンアルゴリズム-jwtなど。

認証されたユーザーは自動的に解決され、最初のパラメーターとしてroutes/channels.phpファイルのクロージャー関数に渡されるため、現在ログインしているユーザーのチャネルの可用性を確認できます enter image description here

2
Jakhongir

私にとってうまくいったのは、Laravel Echoパッケージのメソッド private を使用することでした: https://laravel.com/ docs/5.3/notifications#listening-for-notifications

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

チャネルルートを作成して解決します。

Routes-> channels.phpで承認チャンネルを作成します

Broadcast::channel('chatroom', function ($user) {
    return $user;
});

ドキュメントを参照してください: https://laravel.com/docs/5.4/broadcasting#authorizing-channels

ありがとう

2
M Arfan

チャンネルの認証方法を確認してください。設定によっては、これが役立つ場合があります。 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(['middleware' => ['auth:api']]);

        require base_path('routes/channels.php');
    }
}

Laravel Passportで使用するために、Auth APIミドルウェアに追加します。

1
Ben F

これは、ログインしていない場合に発生する可能性があります。Laravelアプリに実際にログインしていることと、現在のセッションの有効期限が切れていないことを確認してください。

私は再びログインし、それは私のために働いた。

0
FerrisBueller

誰かが最新の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));
});

このように、ユーザーを含むあらゆるイベントを放送するあらゆるチャンネルで機能します。

私はそれが他の誰かを助けることを願っています。

0
Jacinto Joao

私の場合、問題は間違ったユーザーIDでした:

Echo.private('user.'+CURRENT_USER_ID_HERE)
0