バーテンダーエンジニア

元フレアバーテンダーからエンジニアに転職。未経験からのエンジニア転職経験談・実務で感じたこと・個人開発で学んだ内容・日常話などマイペースに発信していきます。仕事ではphp、Laravel、Vue.js、Angular辺りを触ってます。趣味は筋トレ!!ソムリエの資格も持ってます^^

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が明記されるのでエラーを解決する事ができます。