はじめに

config/auth.php にデフォルトで設定されている guards.api を使用してAPI認証を行うために必要な項目についてまとめました。
ベースとなる認証については php artisan make:auth で作成している前提となります。Laravel5.7で確認しました。

カラム追加

users テーブルにトークンを保持するための api_token カラムを追加します。

$ php artisan make:migration add_api_token_to_users_table --table=users
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddApiTokenToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('api_token', 60)->unique()->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('api_token');
        });
    }
}
$ php artisan migrate

モデル変更

App\Userの $fillable と $hidden に api_token を追加します。

トークンの作成・削除

ログイン時にトークンを生成、ログアウト時にトークンを削除する処理を入れます。
app/Http/Controllers/Auth/LoginController.phpに以下を追加します。

use Illuminate\Support\Str;

class LoginController extends Controller
{
    protected function authenticated(Request $request, $user)
    {
        $user->update(['api_token' => Str::random(60)]);
    }

    public function logout(Request $request)
    {
        $user = $request->user();
        $user->update(['api_token' => null]);

        $this->guard()->logout();

        $request->session()->invalidate();

        return $this->loggedOut($request) ?: redirect('/');
    }
}

動作確認

routes/api.phpにデフォルトで定義されている以下のルーティングで確認します。

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

webから任意のユーザでログインし、トークンを生成します。生成したトークンはGETパラメータ api_token で渡すか、Headerパラメータの Authorization: Bearer トークンで渡すことができます。
/api/user にアクセスしてログインしているユーザの情報がjsonで取得できれば成功です。

認証に失敗した場合、Headerパラメータの Accept: application/json または X-Requested-With: XMLHttpRequest が設定されている場合は “message”: “Unauthenticated.” のjsonレスポンスが、それ以外はログイン画面に遷移するようになっています。

参考

https://qiita.com/zaburo/items/57657c78f54accf400f6
https://www.webopixel.net/php/1343.html
https://readouble.com/laravel/5.8/ja/api-authentication.html