はじめに
本記事では、Next.jsとLaravelを使用したアプリケーション開発中に遭遇する可能性のある認証関連の問題に焦点を当てています。具体的には、サーバーサイドレンダリング(SSR)時にLaravel Sanctum
を用いた認証を行う際の一般的なエラーと、その解決策について解説します。
エラー
- エラー内容はSSR内にてサーバーサイドフェッチ時apiを実行すると
401 Unauthenticated
が返ってきてしまうものです。
原因
この問題の主な原因は、SSR中にAPIリクエストを行う際、適切なReferer
ヘッダーやOrigin
ヘッダーが設定されていないことにあります。Laravel Sanctumではこれらのヘッダーを利用してリクエストがアプリケーションのフロントエンドから送信されたものであることを検証するらしいです、、、。
解決策
-
APIリクエストのヘッダーに
Referer
とOrigin
を含める: Next.jsからのすべてのAPIリクエストに、正しいReferer
ヘッダーとOrigin
ヘッダーを明示的に設定します。これにより、Laravelがリクエストの正当性を認識し、CSRFトークンエラーを回避できます。(SSR実行ファイル)fetch("https://yourdomain.com/api/endpoint", { method: "GET", // または POST, PUT など headers: { 'Referer': 'https://yourdomain.com', 'Origin': 'https://yourdomain.com' }, credentials: 'include' // クッキーを送信するために必要 });
-
セッションの設定を確認する: LaravelとNext.jsの間でセッションが正しく共有されているかを確認します。
SANCTUM_STATEFUL_DOMAINS
の設定を適切に行うことで、セッションの維持が可能です。
結果
上記の変更を加えた後、SSRでの認証プロセスが正常に機能し、CSRF token mismatch
のような エラーが解消されました。
終わりに
この問題はNext.jsとLaravelのSanctumを組み合わせて使用する場合に必要な対応であり、適切なヘッダーの設定が必要です。
公式にはそこまでの情報は書いてないので、同じエラーが出た人の助けになれば幸いです!!
参考