メモメモメモ

ほんとうにめも

【Laravel】APIリクエストでauth()->user()がnullになってしまって詰まった

結論

これ。 stackoverflow.com

要するに

  • auth()->user()を使うと、Laravelはdefault guardを使う。
  • default guardはconfig/auth.phpで定義されている。僕の場合は以下だった(大体そうであろう)
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
  • 上記の場合、default guardはwebなので、APIリクエストでauth()->user()の結果がnullになってしまう。

解決策

auth:apiミドルウェアを通す

Route::group(['middleware' => 'auth:api'], function () {
  // your route here
});

のように、auth:apiミドルウェアを通すとLaravelがdefault guardではなくapi guardを使ってくれる。

ただし、これだと「認証ユーザのみがアクセス可能なroute」になってしまうので、認証状態に関係なくアクセスできて、認証状態に応じて処理を変えたい場合などに対応できない。 その場合は次の方法が良さそう。

認証ユーザ情報取得時にguardを設定する

auth()->guard('api')->user()のようにすると、api guardを使って認証情報を取得できる。 $request->user('api')\Auth::guard('api')->user()でも同じ意味。