Laravelの認証でwebとapiの両方を使う

LaravelでのAPIの認証は、こちをご参照ください。
→ [LaravelでのJWT認証](https://qiita.com/nozaki-sankosc/items/7ed320d6549f5f92b9b9)

Laravelの認証は、`config/auth.php`にのguardにて設定しますが、defaultをapiに設定するとwebでの認証ができなくなってしまいます。

```php:config/auth.php
    'defaults' => [
        'guard' => 'api', // ← ここです。
        'passwords' => 'users',
    ],
```
一つのLaravelプロジェクトで、webとapiの両方を実装したいときの対応になります。

Laravelでは`auth()`や、`Auth::login()`などで使用する認証は、guardのデフォルトの方となるようです。
デフォルト以外のものを使うときは、`Auth::guard('[guard名]')->login()`とguardを指定して使用します。
そうすることで、webとapiの両立を実現します。

### defaultの設定
guardのdefaultはwebにしておきます。
make:authのコントローラーもそのまま使えるので便利です。

```php:config/auth.php
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
```

### API側の認証のコントローラにてguardを指定する

実装例のAuthControllerは、[LaravelでのJWT認証](https://qiita.com/nozaki-sankosc/items/7ed320d6549f5f92b9b9)で使用したものです。
[Quick start](https://jwt-auth.readthedocs.io/en/develop/quick-start/)で紹介されているものから少しだけ修正しています。
それに対して、上記のように`auth()`を`Auth::guard('api')`に変更します。

```php:app/Http/Controllers/Api/AuthController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
//        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = Auth::guard('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        Auth::guard('api')->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        try {
            return $this->respondWithToken(Auth::guard('api')->refresh());
        } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
        ]);
    }
}
```

### 認証後のコントローラー
`auth()->user()`は、変更しなくてもユーザー情報の取得はできているようなので、この認証を使って作成するAPI側は特にguardの指定はしなくてもよさそうです。