LaravelでシンプルなトークンベースのAPI認証を行う
はじめに
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