2017-07-07 6 views
0

私はiOSアプリケーション用のLaravel REST APIを開発しています。これはWebパーツがまったくないことを意味し、アプリケーションはCURL要求を介してAPIに通信します。クッキーが使われていますが。Laravel - socket - ratchet - api authentication

今、ソケットがどこにあるのか、オンライン/オフラインのユーザーステータスを確認する必要があります。そして、私はソケット接続でユーザーを認証する方法を理解できません。

すべての例で、私はJSスクリプトがPHPセッションとCookieを使用してLaravelで認証を処理することがわかりました。

私のREST APIのシナリオでは、iOSアプリケーションが後でソケットで使用できるACCESS_TOKENを取得します。

CURLリクエストはログインとパスワードを取得し、JSON フォーマットでアクセストークンを取得し、クッキー内のトークンを更新します。

curl -kX POST https://site/login -b cookies.txt -c cookies.txt -D headers.txt -H 'Content-Type:application/json' -d ' 
{ 
    "username":"gruzua", 
    "password":"qwerty09876", 
}' 

応答

JSON部

{ 
    "access_token":"ACCESS_TOKEN", 
    "expires_in":600, 
} 

クッキー部(念のため):各SEで

HTTP/1.1 200 OK 
Server: nginx/1.10.3 
Content-Type: application/json 
Transfer-Encoding: chunked 
Connection: keep-alive 
Cache-Control: no-cache, private 
Date: Wed, 17 May 2017 17:08:09 GMT 
Set-Cookie: refreshToken=SOME_REFRESH_TOKEN; expires=Mon, 07-Jan-2019 17:08:09 GMT; Max-Age=51840000; path=/; HttpOnly 

quent要求CURLは、私がアクセストークンを持っているし、ソケット接続をオープンする。この時点で 認証

curl -kX GET https://site/user -H 'Authorization: Bearer ACCESS_TOKEN'

にaccess_tokenはトークンを送信します。

http://socketo.me/docs/hello-worldによれば、テルネット接続を開いて、私のACCESS_TOKENを含むJSON形式のデータを書き込むことができます。ラチェットComponentInterface実装onOpenメソッドのサーバー側で私はユーザーの承認を確認する必要があります。おそらくそれは不可能ですonOpen、オプションはメッセージにありますか?とにかく

私の質問は、ここでlaravel認証を使用する方法ですか?

namespace MyApp; 
use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 

class Chat implements MessageComponentInterface { 
    protected $clients; 

    public function __construct() { 
     $this->clients = new \SplObjectStorage; 
    } 

    public function onOpen(ConnectionInterface $conn) { 
     // Store the new connection to send messages to later 

/* 
Here I have to get somehow the user ACCESS_TOKEN 
and to check authorization the way it's checked 
when using CURL passes ACCESS_TOKEN in header 
Something like this 
$user = Auth::user(); 
if (!emtpy($user)) 
{ 
// Check e.g. user permissions (authorization) and allow connection if it's ok 
} 
else 
{ 
// Reject connection 
} 
*/ 
     $this->clients->attach($conn); 

     echo "New connection! ({$conn->resourceId})\n"; 
    } 
... 

私の知る限り、クライアントはJSON文字列をソケット接続に渡すことができます。サーバー私はACCESS_TOKENの私のoauth_access_tokens laravelデータベースを照会し、私のユーザーモデルを取得し、対応するユーザーデータを読み込むことができます。しかし私はそれが正しい方法ではないと思う、私が望むように慣れていないLaravelのガード/ミドルウェアや他のコップの力を使いたいのだが、それは大変に必要だと感じている。だから私は手ではなく、laravelに仕事をさせる認証を確認したい。

私はこのトピックLaravel Ratchet socket Authを知っていますが、セッションとクッキーをリクエストしていますが、これは私の場合は不可能です。

答えて

0

私のソリューションは次のようになります。

JSコードが実行されていないブラウザレスソケット接続(Ratchet)でこの方法を承認する必要があります。だから私はラチェットWebSocket、単純なソケットラチェットIoServerだけを使用することができませんでした。

APIコントロールがJSONを返すので、レスポンスをさらに使いやすくなります。

私はこのアプローチが主にソケット接続を認証するために必要となります(ログイン時にRESTによって得られた)ソケットトークンをクライアントがアクセストークンを知っていると仮定します。

ユーザーはtelnetで接続し、トークンを含むJSON文字列を投稿します。ああ、私は

telnet 192.168.0.100 8080

{"token":"ACCESS_TOKEN"}

を管理していなかったラチェットサーバ・クラスは、次のようになり、ここで Call Laravel controller from code and pass HTTP headers to it

を説明もしそうなら、私のAPIコントローラの応答(虚偽または現在のユーザに応じてautheticated)$ connが認証されているかどうかを判断できます。

ここでは、もう少し狭い質問があり、この質問の回答に役立ちます。Call Laravel controller from code and pass HTTP headers to it