2017-10-09 28 views
2

私は、Laravel 5.5 + Passportを使用してRESTユーザーマイクロサービスを構築しています。 標準のPassport :: routes()を使用していますが、Auth ::ルートを修正してJSON応答を返させ、Passportで動作させる必要がありました。Laravel REST API - 無限ループ

私は私のルート/ web.phpファイルに次の行を追加しました:

Route::group(['middleware' => 'auth:api'], function() { 
    $this->post('logout', 'Auth\[email protected]')->name('logout'); 
}); 

これは=私は、ヘッダー「認可で電話をかける場合は、私はhttps://myapi/logout

  • を投稿することができます>私は首尾よくログアウト応答を得る。
  • 私はまったくのヘッダを提供しない場合、私はしかし、(良い)「認証されていません」というメッセージ
  • を取得し、私が取り消されたトークンを使用してヘッダーを提供する場合、私は、関数の再帰的deadloopを取得:Illuminate\Auth\RequestGuard->user()(それは

これは、すべてのauth:apiミドルウェアで行われているが、私のログアウトコードに達していない)、スタック・オーバーフローするまで、自分自身を再帰的に呼び出し続けるが、私のLoginControllerコンストラクタと呼ばれるです。コンストラクタコード:

public function __construct(Application $app) 
    { 
     $this->apiConsumer = $app->make('apiconsumer'); 

     $this->middleware('guest') 
      ->except('logout'); 
    } 

は、私はそれが私のこの問題の原因コード、またはLaravel +パスポート+認証のいくつかの組み合わせかどう理解するのに苦労しています。

私の最初の考えは、auth:apiミドルウェアがユーザーの認証に失敗し、その結果ユーザーが/ homeにリダイレクトされ、何らかの理由で再帰的にトリガーされたということでした。しかし、そうであれば、ヘッダーがないと正しく動作するのはなぜですか?

私の現在の考えは、問題のトークンがデータベースに存在しますが、Laravelはそれが取り消されていることを理解していません。

感謝任意の提案、

+0

あなたは 'Passport :: routes();'とタイプして 'boot()'メソッドの 'AuthServiceProvider.php'のドキュメントに記載されているように、ログアウトルートを削除して' passport'ルートを登録しようとしましたか? –

+0

私はしていない、私は手動でauthログアウトメソッドを再実装するか? – mils

答えて

0

私は多くの研究の後に答え(そうでない場合は答えを)見つけました。これはLaravelバグ(https://github.com/laravel/passport/issues/440)のようです。ソリューションは、アプリケーション/例外/ Handler.phpで$ dontReport配列にOAuthServerExceptionを追加することです:

class Handler extends ExceptionHandler 
{ 
    protected $dontReport = [ 
     ... 
     \League\OAuth2\Server\Exception\OAuthServerException::class, 
    ]; 
} 

これによりdeadloopを避けるため、利用者の情報をログに記録しようとして避けることができます。