2017-11-01 21 views
1

カスタム認証方式でチャンネルを認証するにはどうすればよいですか?Laravelブロードキャスト認証

たとえば、私のアプリケーションでは、私のAPIのトークン認証(各ユーザーのdbに格納)を使用し、ヘッダー経由で渡され、カスタムミドルウェアによって読み取られます。

これらのカスタム認証方式でのチャンネルへのアクセスを制御するにはどうすればよいですか?どのようにクライアントとサーバー側になりますか?私はsocket.ioを使用していますが、Laravelのドキュメントは、認証メソッドがどのようにソケットのために働くかははっきりしていません。

のUSE CASE:

私はデフォルトLaravelの移行をDBに保存されているユーザーがいます。しかし、私のアプリはAPIだけで、ステートレスなので、remember_tokenをセッショントークンの格納に使用するのではなく、ログインエンドポイントで生成された固有の認証トークンを格納するために使用します。

APIのすべてのエンドポイント、要求は、ユーザが今、質問がでてくる

$token = Request::header('X-token'); 

$request->user = User::findByToken($token); 

return $next($request); 

ヘッダに存在するトークンによって取得されたミドルウェア、通過する。Laravelのドキュメントあまり明確ではありませんプライベートチャンネルの仕組み

ブロードキャストクライアントは、前述のトークンをどのように通過し、特定のチャネルに参加する権限を取得しますか?

+0

ちょっと@Luiz私はまだ何を把握しようとしているのか分かりませんか? – rummykhan

+0

Laravelのデフォルト認証方法(JWTやその他のトークンメソッドなど)を使用しない場合、特定のプライベートチャンネルにユーザーを認証する方法を知りたいです。 – Luiz

+0

@Luizあなたはすでに試したことや知識が不足していると感じるところのいくつかのコード例を提供できますか? – Leith

答えて

1

Laravel documentation on broadcastingは、これについてはかなり包括的ですが、すぐにサポートされていないクライアントライブラリについては細かいことはありません。

この場合、section on authorizing channelsが必要です。ドキュメントから:

Laravelアプリケーションに付属するBroadcastServiceProviderには、Broadcast::routesメソッドの呼び出しがあります。このメソッドは/broadcasting/authルートを登録して承認リクエストを処理します

ブロードキャストルートを定義するとき、現在認証されているユーザーは自動的にパラメータとして渡されます。正しいユーザが渡されるように、認証ルートをブロードキャストルート定義のに変更したいので、ブロードキャストクライアントはトークンを渡します(HTTPヘッダー、URLパラメータ、POSTデータなど)。 )、その後、/broadcasting/authルートをカスタマイズしてそのデータを解析し、そのデータを使用してユーザーを認証します。そこから標準のBroadcast::channel()定義を使用して、認証されたユーザーがそのチャネル上の許可されたユーザーでもあることを確認します。

ドキュメントごとに、Broadcast::routes()は、ミドルウェアを使用するために、$attributesというオプションの配列を取ります。 the sourceから:あなたが望むなら

$attributes = $attributes ?: ['middleware' => ['web']]; 

だから、あなたはBroadcast::routes()コール(または任意の他の標準的なルートパラメーター)に渡すことで'api'にミドルウェアの認証を変更することがあります。

the route is already created for you以降、ルート機能/ミドルウェアよりも低いレベルでカスタマイズしたい場合は、BroadcastProviderのいずれかでメソッドを変更する必要があります。具体的には、ルートが設定されている場合は、calls the authenticate() method on the BroadcastControllerとなり、次に簡単にcalls the auth() method on the Broadcast facadeとなります。ファサードはあなたが使用しているプロバイダを呼ぶでしょう - a few providers defined out of the boxがあります。あなた自身で作成したいのなら、あなたには良い出発点があります。つまり、プロバイダー自体に問題がなければ、独自のミドルウェアを作成して認証として特定のものが必要な場合は、属性としてBroadcast::routes()に渡す方が簡単でしょう( api認証ミドルウェア)。

これをとタグ付けしているため、Laravel Echoも読んでください。 broadcasting introductionに具体的にはsocket.ioと話すセクションもあります。

+0

はい、私はエコーについて見ました。しかし、エコーを使用できない場合や、クライアントでJavaScript以外の言語を使用するとどうなりますか?いずれかの方法。この部分について:「ブロードキャストルートを定義するときは、現在認証されているユーザーはパラメータとして自動的に渡されます.APIユーザーではなく、Web認証ユーザーの場合のみであるようです。 "について、/放送/認証ルートをカスタマイズしてそのデータを解析し、ユーザーを認証するために使用することは明確ではありません。私はこれのためのルートとコントローラを作成しますか?これは何を受け取って返しますか?このルートはいつプロセスで呼び出されますか? – Luiz

+0

@Luizは、より具体的な詳細とLaravelソースへの参照で私の答えを更新しました。あなたがそれを見たことがないなら、Echoについての注釈は興味のために追加されただけです。おそらく、単に 'Broadcast :: routes()'に渡されるミドルウェアを調整して、 'api'認証を使用する必要があります。 – Leith