私は最近、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デバッグコンソールで確認できます。認証ルートに到達すると、失敗します。
エラー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
それは私のために働きました、そしてそれがあなたを助けることを願っています。
/ broadcasting/authルート上に認証ミドルウェアがなかったにもかかわらず、socket.ioをredisとペアにして、403エラーで問題が発生しました。 whatchingの後のみ laracastsレッスン チャネル認証だけでは十分ではないことがわかりました。デフォルトのlaravel authまたは何らかのトークンアルゴリズム-jwtなど。
認証されたユーザーは自動的に解決され、最初のパラメーターとしてroutes/channels.phpファイルのクロージャー関数に渡されるため、現在ログインしているユーザーのチャネルの可用性を確認できます
私にとってうまくいったのは、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
ありがとう
チャンネルの認証方法を確認してください。設定によっては、これが役立つ場合があります。 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ミドルウェアに追加します。
これは、ログインしていない場合に発生する可能性があります。Laravelアプリに実際にログインしていることと、現在のセッションの有効期限が切れていないことを確認してください。
私は再びログインし、それは私のために働いた。
誰かが最新の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));
});
このように、ユーザーを含むあらゆるイベントを放送するあらゆるチャンネルで機能します。
私はそれが他の誰かを助けることを願っています。
私の場合、問題は間違ったユーザーIDでした:
Echo.private('user.'+CURRENT_USER_ID_HERE)