💡 Tips

Auth.js (NextAuth v5) をCloudflare Workersで動かすときのtrustHost設定

Auth.js(NextAuth v5)を Cloudflare Workers にデプロイしたら、ログインのリダイレクトやコールバックでホスト不一致のエラーが出た——。ローカルでは動くのに、だ。結論から言うと、Workers では process.env.AUTH_URL が読めないため、trustHost: true を設定してリクエストヘッダーの Host を信頼させる必要がある。あわせて踏みやすい D1 アダプターの落とし穴も解説する。

なぜ trustHost が要るのか

Auth.js は、コールバックURLの組み立てなどで自分のホスト名を知る必要がある。通常は環境変数 AUTH_URL から取得するが、Cloudflare Workers では process.env に環境変数が載らないため、これが読めない。

そこで trustHost: true を設定し、受信リクエストの Host ヘッダーを信頼してホストを判定させる。

import NextAuth from 'next-auth';

export const { handlers, auth } = NextAuth({
  trustHost: true, // ← Workers では必須
  providers: [/* ... */],
});

これを忘れると、ホスト判定に失敗してログインフローが途中で壊れる。

⚠️ trustHost: true は Host ヘッダーを信頼する設定なので、信頼できるエッジ(Cloudflare)の背後で使うことが前提。任意のリバースプロキシ構成では意味を理解した上で使うこと。

もう一つの沼: @auth/d1-adapter はテーブルを自動作成しない

D1 をセッションストアに使う場合、@auth/d1-adapter を入れるだけでは動かない。このアダプターはテーブルを自動作成しないため、マイグレーションで明示的にスキーマを用意する必要がある。

# アダプターが期待するテーブルをマイグレーションで作成する
wrangler d1 migrations apply <DB_NAME>

「アダプターを入れたのに no such table で落ちる」のはこれが原因のことが多い。アダプターの README にあるスキーマSQLをマイグレーションファイルに落として適用しよう。

環境変数まわりの前提を揃える

Workers の流儀に合わせて、設定値は env バインディング経由で渡す。シークレット(AUTH_SECRET など)は wrangler secret put で登録する。

wrangler secret put AUTH_SECRET

wrangler.jsoncvars は公開情報のみ。認証シークレットを平文で置かないよう注意したい。

さらに学ぶなら

エッジ環境の認証は「Node.js の常識が通じない」ポイントが多く、断片対処だと消耗しやすい。Web 認証やセキュリティの基礎を1冊で押さえておくと、こうした設定の意味が腑に落ちて速くなる。

📚 おすすめ書籍

Real World HTTP

Webと認証の基礎理解に

Amazonで見る →

まとめ

  • Workers では AUTH_URL が読めないので trustHost: true が必須
  • trustHost は Host ヘッダーを信頼する設定。信頼できるエッジ前提で使う
  • @auth/d1-adapter はテーブルを自動作成しない。マイグレーションで明示する
  • シークレットは wrangler secret put、公開値のみ vars に置く