This content originally appeared on Twilio Blog and was authored by Chimezie Enyinnaya
この記事はソフトウェアエンジニアのChimezie Enyinnayaがこちらで公開した記事(英語)を日本語化したものです。
Laravel Sanctum(旧称Airlock)は、シングルページアプリケーション(SPA)、モバイルアプリケーションや基本的なトークンベースのAPI用に作成されたLaravelパッケージです。これによりAPIトークンをユーザーに発行し、Laravelセッションを使用したシングルページアプリケーション認証が行えます。Laravel Sanctumは、既存のLaravel Passportパッケージの簡易版です。PassportよりもSanctumを選ぶ理由は以下のとおりです。
- PassportはOAuth2認証が実装されています。これを使用しないのであれば、APIトークンの発行はSanctumで行えます。
- Sanctumは超軽量でシンプルに実装できます。
- Sanctumは、Vue、Angular、Reactなどのシングルページアプリケーションに対応しています。モバイルアプリケーション認証も対応しています。
必要条件
このチュートリアルを進めるには次の項目が必要です。
Laravel Sanctumでは多くのことができますが、このチュートリアルではLaravel Sanctumを使用したAPIの構築方法を説明します。
はじめに
まず、新規のLaravelアプリケーションを作成します。ターミナルで次のコマンドを実行してください。
composer create-project --prefer-dist laravel/laravel laravel_sanctum
laravel_sanctum
はアプリケーションの名前です。このコマンドで、Laravelアプリケーションを格納する新しいフォルダ、laravel_sanctum
が作成されました。
ここで、Laravelアプリケーションを起動して問題なく動作することを確認しておきましょう。以下のコマンドを実行してください。
cd laravel_sanctum
php artisan serve
インストールとセットアップ
Laravelアプリケーションの準備ができたらLaravel Sanctumを追加します。まず、Composerを使用してアプリケーションにLaravel Sanctumをインストールします。以下のコマンドを実行してください。
composer require laravel/sanctum
次に、Laravel Sanctumの設定と移行ファイルを公開します。以下のコマンドを実行してください。
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
sanctum.phpファイルがconfigディレクトリに作成され、migrationsディレクトリに必要な移行ファイルが配置されます。
移行の前に、データベースのセットアップが必要です。database.sqliteファイルを作成します。以下のコマンドを実行してください。
touch database/database.sqlite
Windows環境はtouch
コマンドが使用できません。必要に応じてIDEを使用してファイルを作成してください。
以下のように.envファイルを更新してください。
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
データベースを移行します。以下のコマンドを実行してください。
php artisan migrate
デフォルトでLaravelに付属するテーブルに加え、すべてのトークンを格納するpersonal_access_tokens
テーブルがデータベースに作成されます。
最後に、Laravel Sanctumを使用してユーザートークンを作成する前に、User
モデルでHasApiTokens
トレイトが使用されるようにします。app/Models/User.phpファイルを開き、次の修正を加えてください。
// app/Models/User.php
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
APIを作成する
シンプルな構成をとるために、APIのエンドポイントは3つのみです。最初のエンドポイントはアカウントの登録に、2つ目のエンドポイントはユーザーよるログインと認証に使用します。3つ目のエンドポイントは現在認証されているユーザーをフェッチします。
それでは、アカウントを登録してみましょう。認証を行うコントローラーを作成します。ターミナルで以下のArtisanコマンドを実行してください。
php artisan make:controller AuthController
app/Http/Controllersフォルダーに新しくAuthController.phpファイルが作成されます。
ユーザー登録を行うルートを作成します。routes/api.phpファイルを開き、以下のコードを追加してください。
// routes/api.php
use App\Http\Controllers\AuthController;
Route::post('/register', [AuthController::class, 'register']);
ユーザー登録メソッドを作成します。AuthController
を開き、以下のコードを追加してください。
// app/Http/Controllers/AuthController.php
use Illuminate\Support\Facades\Hash;
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8',
]);
$user = User::create([
'name' => $validatedData['name'],
'email' => $validatedData['email'],
'password' => Hash::make($validatedData['password']),
]);
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
まず、着信リクエストを検証し、必要な変数がすべて含まれていることを確認します。次に受け取ったデータをデータベースに格納します。createToken()
メソッドを使い、作成されたユーザーに新しい個人アクセストークンを生成します。トークンをauth_token
と名付けます。createToken()
によりLaravelのインスタンスが返されます。このインスタンスにplainTextToken
プロパティを呼び出し、トークンのプレーンテキスト値にアクセスします。最後に、作成されたトークンとトークンタイプを含むJSONレスポンスを返します。
続いて、ユーザーをログインページに戻すための実装を追加します。以下のコードをroutes/api.phpに追加してください。
// routes/api.php
Route::post('/login', [AuthController::class, 'login']);
そして、AuthController
の中にlogin()
メソッドを追加します。以下のコードを追加してください。
// app/Http/Controllers/AuthController.php
use App\Models\User;
use Illuminate\Support\Facades\Auth;
public function login(Request $request)
{
if (!Auth::attempt($request->only('email', 'password'))) {
return response()->json([
'message' => 'Invalid login details'
], 401);
}
$user = User::where('email', $request['email'])->firstOrFail();
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
上記のコードにより、入力されたメールアドレスとパスワードが実際のusers
テーブルと一致するかをチェックし、ユーザーの新しい個人アクセストークンを生成します。
最後に、現在認証されているユーザーをフェッチする機能を加えます。以下のコードをroutes/api.phpに追加してください。
// routes/api.php
Route::post('/me', [AuthController::class, 'me']);
そして、AuthController
に次のコードを追加してください。
// app/Http/Controllers/AuthController.php
public function me(Request $request)
{
return $request->user();
}
このコードは非常にシンプルです。現在認証済みのユーザーを返します。
エンドポイントを認証済みユーザーのみに限定する
お考えのとおり、/me
エンドポイントは認証済みのユーザーのみがアクセスできるようにしなければなりません。そのためにsanctum
認証ガードが使えます。
次のようにルートを更新してください。
// routes/api.php
Route::post('/me', [AuthController::class, 'me'])->middleware('auth:sanctum');
これにより、このエンドポイントのリクエストのヘッダーに有効なAPIトークンが含まれるようになります。
APIをテストする前に、app/Providers/RouteServiceProvider.phpの以下のコメントを解除してください。
// app/Providers/RouteServiceProvider.php
protected $namespace = 'App\\Http\\Controllers';
APIをテストする
作成したAPIをテストしてみましょう。ここではInsomniaを使用しますが、お好きなHTTPクライアントを使用できます。
まず、アプリケーションの実行を確認します。ターミナルで以下のコマンドを実行してください。
php artisan serve
アプリケーションはhttp://127.0.0.1:8000で実行されます。APIにはhttp://127.0.0.1:8000/apiからアクセスします。
さらに次の例のように、Insomniaでリクエストができます。
新規ユーザーを作成する
新しいユーザーを作成するために、http://127.0.0.1:8001/api/register宛にname
、email
とpassword
を含むPOSTリクエストを作成します。パスワードは8文字以上必要です。
ユーザーとしてログインする
ログインには、email
とpassword
(プレーンテキスト)を追加し、http://127.0.0.1:8001/api/loginにPOSTリクエストを行います。
有効なトークンを使用して/meエンドポイントにアクセスしようとすると、以下のような結果になります。
有効なトークンを使用しないと、以下のようにユーザー詳細が表示されます。
まとめ
このチュートリアルでは、Laravel Sanctumとその機能について紹介しました。Laravel Passportとの違いや、その用途も取り上げました。さらに、Laravel Sanctumを使用してユーザー情報にアクセスするために、トークンを作成して認証を行い、ユーザーにLaravel APIの使用を許可する方法を説明しました。
Laravel Sanctumについて詳しくは、公式ドキュメントを参照してください。
このチュートリアルの全ソースコードはGitHubで確認できます。
Chimezie Enyinnayaは、ソフトウェアエンジニア兼インストラクターです。Chimezie Enyinnayaについてもっと知りたい方は、以下の連絡先でご確認ください。
Webサイト: https://adonismastery.com
Twitter: https://twitter.com/ammezie
GitHub: https://github.com/ammezie
This content originally appeared on Twilio Blog and was authored by Chimezie Enyinnaya
Chimezie Enyinnaya | Sciencx (2021-10-27T03:16:46+00:00) Laravel SanctumでPHPのRESTful APIを構築する. Retrieved from https://www.scien.cx/2021/10/27/laravel-sanctum%e3%81%a7php%e3%81%aerestful-api%e3%82%92%e6%a7%8b%e7%af%89%e3%81%99%e3%82%8b/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.