🤖

[Laravel10]Sanctumでマルチ認証を行う方法

2024/11/20に公開

目的

Laravel Sanctum を使用し、マルチ認証を実現します。

https://readouble.com/laravel/10.x/ja/sanctum.html

実装方針

  • Admin と User でマルチ認証を行います。
  • Laravel Sanctum のトークンアビリティミドルウェアを使用します。

Laravel Sanctum のトークン

Sanctumでは、トークンに「アビリティ」を割り当てることができます。アビリティはOAuthの「スコープ」と同様の目的を果たします。

OAuth のスコープとは?

OAuth 2.0 スコープは、アクセス トークンに付与するアクセス権の範囲を制限する手段です。 たとえば、クライアント アプリに対して発行するアクセス トークンに、保護されたリソースへの読み取りと書き込みのアクセス権を付与するか、読み取りアクセス権だけを付与するかは、スコープによって制御できます。

上記内容を踏まえると Laravel Sanctum のトークンを使用し、マルチ認証を実現するのは最適だと思います。

実装例

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

Route::middleware(['auth:sanctum', 'ability:admin'])->get('/admin', function (Request $request) {
    return $request->user();
});

Route::post('/user/login', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    $user = User::where('email', $request->email)->first();

    return $user->createToken("login:user{$user->id}", ['user'])->plainTextToken;
});

Route::post('/admin/login', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    $user = Admin::where('email', $request->email)->first();

    return $user->createToken("login:admin{$user->id}", ['admin'])->plainTextToken;
});

説明

createToken() の第二引数でアビリティをセットし、

return $user->createToken($request->email, ['user'])->plainTextToken;

auth:sanctum ミドルウェアの第二引数でアビリティチェックを行うよう指定します。

Route::middleware(['auth:sanctum', 'ability:user'])->get('/user', function (Request $request) {

Discussion