2017-02-08 3 views
0

イルミネイト4.1パッケージに基づくJWTサポートで完全機能のAPIを起動しようとしていました。スタンドアロンイルミネイト4.1スタックのフィルタの前にイベントが発生しない

現在のスタックが含まれています:

  • イベント
  • キャッシュ
  • 私が使用しているデータベース
  • 設定
  • 認証

そして、JWTのため

  • ルーティング
  • モードtymon/jwt-auth 0.4のifiedバージョン(変更のみがPHP 5.4より前に配列構文をダウングレードし、ommit $ thisへのクロージャの変更)

    これまでのところ、コンテナは動作していますが、私はルーティングを得るために苦労しているようです。beforeフィルタが動作しています。問題は、beforeフィルタが "無視される"ということです。テストルートを使用して、応答を返す代わりにコントローラの出力で応答します。トークンが見つからないか類似しています。

    タイモン/ JWT-AUTHのセットアップウィキに続いて、私は手動でもJWTAuth::parseToken()->toUser()を行うことで、トークンを解析することによって、そのテスト

    <?php 
    
    /** @var \Illuminate\Routing\Router $router */ 
    $router = $app['router']; 
    
    $router->post('/auth', 'MyApp\Api\Controllers\Auth\[email protected]'); 
    
    $router->group(array('before' => 'jwt-auth'), function (\Illuminate\Routing\Router $router) { 
        $router->post('/authed', 'MyApp\Api\Controllers\[email protected]'); 
    }); 
    

    私のroutes.phpの中でjwt-authフィルタを使用してルーティンググループを作成しました完全に機能したので、問題をbeforeフィルタに切り離しました。

    フィルタを処理する方法についてスタックを歩き、イベントDispatcherで発生した部分に到達しました。これについての私の理論は、それがイベントを発射していないか、またはリスナーがそれほど反応しないということです。

    私はテスト対象として、オリジナルのtymon/jwt-auth 0.4を持つLaravel 4.1アプリケーションを作成しました。私は同様にすべてをセットアップし、beforeフィルタが動作するように動作します。参考として

    、ここに私の全体を照らしスタックAPIのブートストラップ(パブリック/ index.phpを)

    <?php 
    
    header('Content-Type: application/json'); 
    
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD'); 
    
    require_once(__DIR__ . '/../../../vendor/autoload.php'); 
    require_once(__DIR__ . '/../../../vendor/illuminate/support/Illuminate/Support/helpers.php'); 
    
    use Illuminate\Auth\AuthServiceProvider; 
    use Illuminate\Cache\CacheServiceProvider; 
    use Illuminate\Config\FileLoader; 
    use Illuminate\Config\Repository; 
    use Illuminate\Container\Container; 
    use Illuminate\Events\EventServiceProvider; 
    use Illuminate\Filesystem\Filesystem; 
    use Illuminate\Filesystem\FilesystemServiceProvider; 
    use Illuminate\Http\JsonResponse; 
    use Illuminate\Http\Request; 
    use Illuminate\Routing\RoutingServiceProvider; 
    use Illuminate\Support\ClassLoader; 
    use Illuminate\Support\Facades\Facade; 
    use Tymon\JWTAuth\Providers\JWTAuthServiceProvider; 
    
    $configDir = __DIR__ . '/../config'; 
    $controllersDir = __DIR__ . '/../src/Controllers'; 
    $modelsDir = __DIR__ . '/../../../models'; 
    
    ClassLoader::register(); 
    ClassLoader::addDirectories(array($controllersDir, $modelsDir)); 
    
    $app = new Container; 
    Facade::setFacadeApplication($app); 
    
    $app['app'] = $app; 
    
    $app['env'] = env('APP_ENVIRONMENT'); 
    
    $loader = new FileLoader(new Filesystem, $configDir); 
    $config = new Repository($loader, 'production'); 
    
    $app['config'] = $config; 
    
    $request = Request::createFromGlobals(); 
    $app['request'] = $request; 
    
    with(new EventServiceProvider($app))->register(); 
    with(new CacheServiceProvider($app))->register(); 
    with(new RoutingServiceProvider($app))->register(); 
    with(new FilesystemServiceProvider($app))->register(); 
    with(new AuthServiceProvider($app))->register(); 
    with(new JWTAuthServiceProvider($app))->register(); 
    
    require(__DIR__ . '/../src/routes.php'); 
    
    try { 
        $response = $app['router']->dispatch($request); 
    } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { 
        $response = new JsonResponse(array(
         'status_code' => $e->getStatusCode(), 
         'message' => $e->getMessage() 
        ), $e->getStatusCode()); 
    } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { 
        $response = new JsonResponse(array(
         'status_code' => $e->getStatusCode(), 
         'message' => $e->getMessage() 
        ), $e->getStatusCode()); 
    } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) { 
        $response = new JsonResponse(array(
         'status_code' => $e->getStatusCode(), 
         'message' => $e->getMessage() 
        ), $e->getStatusCode()); 
    } catch (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e) { 
        $response = new JsonResponse(array(
         'status_code' => JsonResponse::HTTP_NOT_FOUND, 
         'message' => 'Route not found' 
        ), JsonResponse::HTTP_NOT_FOUND); 
    } catch (\Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException $e) { 
        $response = new JsonResponse(array(
         'status_code' => JsonResponse::HTTP_FORBIDDEN, 
         'message' => 'Method not allowed' 
        ), JsonResponse::HTTP_FORBIDDEN); 
    } 
    
    $response->send(); 
    

    がある誰も私に動作する前にフィルタを取得する方法についていくつかのポインタを与えることができますか? サービスプロバイダの登録に関連する可能性がありますか? イベントを成功させるために何かが欠けていますか? デフォルトのイベントリスナーがない可能性がありますか?

  • 答えて

    1

    100%ではわかりませんが、登録されたプロバイダの場合はboot()ステップが見逃されているようです。

    jwt-authパッケージプロバイダは、boot()方法でフィルタを登録されています

    public function boot() 
    { 
        $this->package('tymon/jwt-auth', 'jwt', __DIR__.'/../'); 
        $this->bootBindings(); 
        // register the command 
        $this->commands('tymon.jwt.generate'); 
        // register the filter 
        $this->app['router']->filter('jwt-auth', 'tymon.jwt.filter'); 
    } 
    

    私はJWTAuthServiceProviderregister()メソッドを呼び出す前に、あなたもboot()メソッドを呼び出す必要があることを言うと思います。

    +0

    ハハ、あなたは私を救った。私は、サービスプロバイダを登録した後に 'boot()'を起動しなければなりませんでした。また、アプリケーションコンテナへの 'path'をおろす必要がありました。しかし、これらの変更を加えれば、beforeフィルターが機能しています。この問題を見つけるのを手伝ってくれてありがとう、ありがとう。私は21時間であなたに賞金を授与します:) –

    +0

    嬉しいことです。 'register()'の前に 'boot()'を実行することをお勧めします。これはLaravelがサービスプロバイダを扱う順序です。 – radmen

    関連する問題