LaravelApiでログイン実装の際に500エラーが返ってきた...
エラー発生まで
Larvavelのデフォルトで用意されている認証機能を利用してAPIのユーザー認証機能を作成していました。
テストの勉強も兼ねて、テストコードを実行すると以下のエラーが発生しました。
-テストコード- // ログイン可能を確認するテスト /** * @test */ public function 登録済みのユーザーを認証して返却() { $response = $this->json('POST', route('login'), [ 'email' => $this->user->email, 'password' => 'password', ]); $response->assertStatus(200) ->assertJson(['name' => $this->user->name]); $this->assertAuthenticatedAs($this->user); } -エラー- ┐ ├ Expected status code 200 but received 500. ├ Failed asserting that false is true.
上記のテストコードは、認証機能が正常に動作するかを確認するものです。
エラーの原因
今回は、API側のrouteを「routes/api.php」に記載しました。Laravelのデフォルトの認証機能には、essionを使用する記載があります。
RoutingのapiミドルウェアではSessionStartの記載がないため、Sessionを上手く利用できずエラーが発生したようです。
-Kernel.php- protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:60,1', 'bindings', ], ];
解決方法
apiのミドルウェアにSessionを使用するコードを追記する方法でも動作はすると思うのですが、
app/Providers/RouteServiceProvider.php を以下の通りに編集する事で対応が可能になります。
-app/Providers/RouteServiceProvider.php protected function mapApiRoutes() { Route::prefix('api') ->middleware('web') // 'api' → 'web' に変更 ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
RouteServiceProvider はアプリケーション起動時にルート定義を読み込むためのクラスです。
今回の対応で、routes/api.php に記述したルート定義に適用されるミドルウェアグループをweb に変更する事でSessionが明記されるのでエラーを解決する事ができます。