0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel Sanctumを触ってみる

Last updated at Posted at 2023-02-06

はじめに

SanctumのSPA認証の実装をしてみたので共有します。

Laravel Sanctum:SPA認証

SanctumはWeb API用の認証機能を提供するパッケージです。

提供される認証方式はAPIトークン、SPA認証の2つがありますが、今回はSPA認証について解説します。

SPA認証

SPAのためのセッション認証サービスです。
Laravelの「web」認証ガードを利用して実現しています。
CSRF保護、XSS攻撃による情報漏洩を保護します。

SPA認証のステップ

1 : セッション管理対象のフロントエンドのオリジンを指定する。

envファイルで次のようにセッション管理対象のフロントエンドのオリジンを設定します。

.env
SANCTUM_STATEFUL_DOMAINS="localhost:80"

上記の環境変数は以下の箇所で使用されます。

config/sanctum.php
'stateful' => explode(',', env(
    'SANCTUM_STATEFUL_DOMAINS',
    'localhost,127.0.0.1,127.0.0.1:8000,::1'
)),

2 : CSRFトークンの取得

CSRFとは、生成元が異なる許可されていないフロントエンドからのリクエスト送信です
罠が仕掛けられたリンクにアクセスすることで無関係のサイトにアクセスさせられ、利用者が意図しない操作を実行させられます。

そのため、異なるオリジンのWebサイトからのアクセスをブロッキングする必要があります

CORS設定で許可したフロントエンドのみにCSRFトークンを付与し、そのトークンを持つフロントエンドからのリクエストのみを受け付けるようにします。(CORSの設定はcors.phpで行います)

そうすることでフロントエンドの信頼性を担保しています。

Sanctumをインストールすると、自動で/sanctum/csrf-cookieというルートが作成されます。

$ php artisan route:list
 GET|HEAD   sanctum/csrf-cookie ............................................ sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show

こちらにアクセスすると、レスポンスのcookieにXSRF-TOKENが入って返ってきます。

このcookieに入ってるトークン(CSRFトークン)をフロント側でX-XSRF-TOKENヘッダにセットすることでリクエストを送信することができるようになります。

3 : Sanctumのミドルウェアを使用する

Sanctumのミドルウェアをapp/Http/Kernel.phpファイル内のapiミドルウェアグループに追加します。

app/Http/Kernel.php
protected $middlewareGroups = [
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

こうすることで、api.phpファイル内のルートに適用したいミドルウェアを指定できます。

EnsureFrontEndRequestsAreStatefulミドルウェアはセッションの作成、CSRFトークンが正常であるかなどを確認します。

SANCTUM_STATEFUL_DOMAINSに設定されているドメインからのアクセスの場合にトリガーされます。

問題がない場合は新しいセッションが作成され、対応するcookieが返されます。

4 : ルートを保護する

認証済みじゃ無いとアクセスできないルートは次のように定義できます。

routes/api.php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

/api/userにアクセスする際に、認証済みで無い場合はエラーになります。

Sanctumの設定は以上になります。

※ログイン成功時にセッションを作成する箇所は別途実装する必要があります。(Laravel Fortifyを利用すれば最初からセッションを作成するコードは書かれているため実装は不要です。)

まとめ

Sanctumがやってくれることは大きく分けて次のことになります。

・CSRFトークンを提供するAPI
・セッションの作成
・認証済みであることを条件とするルートの作成

新規登録、ログイン、ログアウトなどの機能は別途実装する必要があります。

参考文献

Laravel Sanctum

CSRF

CORS

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?