Laravel Sanctumを試してみる

概要

ISRを利用したサイト開発を行うにあたり、認証周りの調査を行っていた。
その中でLaravel Sanctumの存在を知ったので遊んでみる。

所感

古き良きCookieを使ったセッションの仕組みを、トークンで再現した感。

試してみる

Laravel Sanctumとは

Laravel Sanctum(サンクタム、聖所)は、SPA(シングルページアプリケーション)、モバイルアプリケーション、およびシンプルなトークンベースのAPIに軽い認証システムを提供します。Sanctumを使用すればアプリケーションの各ユーザーは、自分のアカウントに対して複数のAPIトークンを生成できます。これらのトークンには、そのトークンが実行できるアクションを指定するアビリティ/スコープが付与されることもあります。 https://readouble.com/laravel/8.x/ja/sanctum.html

SPA向けの認証システムらしい。
導入に関しては引用の記事を見ればできるので、ここでは割愛。

独自の設定に取り込む

記事では標準のUserModelに対する組み込みを記載されているが、標準以外も動くか気になった。 その場合も、HasApiTokensのTraitで差し込むことで実装できる。

<?php
declare(strict_types=1);
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
 
class Hoge extends Model
{
    use HasApiTokens, HasFactory, Notifiable;

独自のログイン情報でも下記のようにトークンが返ってくる。

$ curl -X POST http://localhost:8088/api/v1/tokens/create  -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"id\":\"id\", \"pass\":\"パス\"}"
{"token":"1|LaMzf5HxLkrKDS0sLfCdWZwhf8QNNem77qa03l29"}

発行のコードはこんな感じで、テーブルにデータを作る仕組みになっている。

https://github.com/laravel/sanctum/blob/dd84a9141012c5509922df0c72866110f45026cb/src/HasApiTokens.php#L44

public function createToken(string $name, array $abilities = ['*'])
{
    $token = $this->tokens()->create([
        'name' => $name,
        'token' => hash('sha256', $plainTextToken = Str::random(40)),
        'abilities' => $abilities,
    ]);
 
    return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken);
}

古き良きCookieを使ったセッションの仕組みを、トークンで再現した感がある。 同じパラメータで渡すと、新しいトークンが返ってくるところも似ている。