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.jsonc の vars は公開情報のみ。認証シークレットを平文で置かないよう注意したい。
さらに学ぶなら
エッジ環境の認証は「Node.js の常識が通じない」ポイントが多く、断片対処だと消耗しやすい。Web 認証やセキュリティの基礎を1冊で押さえておくと、こうした設定の意味が腑に落ちて速くなる。
まとめ
- Workers では
AUTH_URLが読めないのでtrustHost: trueが必須 trustHostは Host ヘッダーを信頼する設定。信頼できるエッジ前提で使う@auth/d1-adapterはテーブルを自動作成しない。マイグレーションで明示する- シークレットは
wrangler secret put、公開値のみvarsに置く