Laravel API認証サービス Sanctumについて
~ はじめに ~
まずLaravelが用意しているAPI認証はいくつか存在します。
・標準
- Basic認証
auth.basicミドルウェアを利用してBasic認証をすることが可能です。
onceBasicメソッドを利用すれば、ステートレスなBasic認証も可能になります。
・API認証系ライブラリ
- Passport
OAuth2.0による認可、認証のための認可サーバ実装を簡単にできるようにしてくれます。
- Sanctum (今回のメイン)
7.x では「Airlock」だった
トークンベースの認証、クッキーベースの認証など、軽めの認証システムを提供してくれます。
バックエンドにLaravelを使うSPAや、モバイルアプリ作成に向けたもの。
~ Sanctum ~
・インストール
- composerでインストール
composer require laravel/sanctum
- Sanctumの設定ファイルとmigrationファイルを vendor:publish artisanコマンドで生成
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
- 最後にAPIトークンを記録するテーブルを生成
php artisan migrate
・概要
Sanctumは以下三つの認証を提供しています。
・APIトークン認証
Bearer認証方式、つまりTokenベースの認証方式です。
createToken メソッドによりトークンを発行でき、ハッシュ化して事前に用意したDBに保存されます。
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->id.'|'.$plainTextToken);
}
plainTextToken メソッドを使えばプレーンテキスト値を取得でき、クライアント側に送信できます。
$token = $request->user()->createToken($request->token_name);
return ['token' => $token->plainTextToken];
あとは「Bearer」トークンとして「Authorization」ヘッダに含めて返せば、認証をしてくれます。
ただどのルートを保護するかは設定しておく必要があります。
以下のようにミドルウェアを通せば、認証してくれます。
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
特にセッションに関して設定を変えていないのであれば、
web.php に配置した場合は、LaravelにもとからあるセッションのCookie認証を最初に行います。
Cookieが送られてこなければ、APIトークン認証をするという形になります。
また別の認証ライブラリJetstreamをインストールすればこの作業自体も必要なくなるみたいです。
・SPA認証
Cookieベースのセッション認証
Laravel標準で使われているセッション認証をAPI認証でも利用します。
セッションを利用するので、sanctum設定ファイルのstateful設定で明示されたドメインに限り、
CORS設定を行い、異なるサブドメインでもステートフルな処理が可能になります。
またCSRF対策も行ってくれます。
具体的な処理は書きませんが流れとしては
- /sanctum/csrf-cookie にリクエストを送り、CSRFトークンを返してもらう。
- /api/login に認証情報をPOSTリクエスト
- 認証されsessionトークンがでステートフルな処理が可能になる。
・モバイルアプリケーション認証
モバイルアプリケーションからのリクエストをトークン認証します。
基本的な流れはAPIトークン認証です。
~ 最後に ~
LaravelライブラリSanctumについてでした。
細かい実装方法等は、ライブラリを参照してください。
認可、認証系の話題は奥が深いなと感じました、、、触れるにはまだ早かったかもしれない、、
参考:
https://qiita.com/pikanji/items/040fa4ab6976059f3762
https://webxreal.com/laravel-sanctum-spa/