デプロイメント
環境変数
一貫性を保つために、すべてのAuth.js環境変数にAUTH_
プレフィックスを付けることをお勧めします。これにより、自動検出が容易になり、他の環境変数と区別しやすくなります。
Auth.jsライブラリでは、AUTH_SECRET
環境変数を設定する必要があります。これは、Cookieとトークンを暗号化するために使用されます。少なくとも32文字の暗号化的に安全なランダム文字列にする必要があります。
npm exec auth secret
OAuthプロバイダーを使用している場合、プロバイダーから**クライアントID**と**クライアントシークレット**が提供されます。これらを環境変数として設定する必要があります(Auth0などのOIDCプロバイダーの場合、issuer
値も必要になる場合があります。プロバイダーのドキュメントを参照してください)。
Auth.jsは**環境変数の推論**をサポートしています。つまり、特定の構文に従ってプロバイダーの環境変数を命名した場合、構成でプロバイダーに明示的に渡す必要がありません。
クライアントIDとクライアントシークレットは、AUTH_[PROVIDER]_ID
とAUTH_[PROVIDER]_SECRET
という名前になります。プロバイダーでissuerが必要な場合は、AUTH_[PROVIDER]_ISSUER
という名前になります。例:
AUTH_OKTA_ID=abc
AUTH_OKTA_SECRET=abc
AUTH_OKTA_ISSUER=abc
詳細については、環境変数ページをご覧ください。
AUTH_SECRET
これは唯一必須の環境変数です。JWTのエンコードと転送中のデータの暗号化に使用されるシークレットです。前述のように、少なくとも32文字のランダム文字列を推奨します。npm exec auth secret
またはopenssl rand -base64 33
を使用してCLIで生成できます。
AUTH_TRUST_HOST
リバースプロキシの背後でアプリケーションをデプロイする場合は、AUTH_TRUST_HOST
をtrue
に設定する必要があります。これにより、Auth.jsはリバースプロキシからのX-Forwarded-Host
ヘッダーを信頼するようになります。アプリケーションがサポートされているホスティングプロバイダーのいずれかで実行されていることを示す環境変数が検出されると、Auth.jsは自動的にこれをtrueと推論します。現在、VERCEL
とCF_PAGES
(Cloudflare Pages)がサポートされています。
AUTH_URL
この環境変数は、v5ではほとんど不要です。ホストはリクエストヘッダーから推論されます。ただし、異なるベースパスを使用している場合は、この環境変数を設定することもできます。たとえば、AUTH_URL=http://localhost:3000/web/auth
またはAUTH_URL=https://company.com/app1/auth
AUTH_REDIRECT_PROXY_URL
この環境変数は、高度なユースケース(たとえば、プレビューデプロイメントの際にAuth.jsをプロキシとして使用するなど)でのみ使用することを目的としています。詳細については、以下のプレビューデプロイメントの保護セクションをご覧ください。
サーバーレス
- 必要な環境変数を目的の環境に対して作成します。選択したプロバイダーに必要な環境変数(つまり、OAuth
clientId
/clientSecret
など)を追加することも忘れないでください。 - OAuthプロバイダーを使用する場合は、本番環境のURLのコールバックURLが正しく設定されていることを確認してください。多くのOAuthプロバイダーでは、OAuthアプリケーションごとに1つの
callbackUrl
しか設定できません。その場合は、各環境(開発、本番など)に個別のアプリケーションを作成する必要があります。Googleなどの他のプロバイダーでは、1つのアプリケーションに多くのcallbackUrl
を追加できます。next-auth
(Next.js)アプリケーションのcallbackUrlは、デフォルトで次のような形式になります。https://company.com/api/auth/callback/[provider]
(company.com
をドメインに、provider
をプロバイダー名(例:github
)に置き換えます)。- 他のすべてのフレームワーク(
@auth/sveltekit
、@auth/express
など)は、デフォルトで/auth/callback/[provider]
パスを使用します。
- デプロイ!これらの2つの前提条件を設定したら、Netlify、VercelなどでAuth.jsアプリケーションをデプロイして実行できるようになります。
ユーザーをデータベースに保存している場合は、テストユーザーベースと本番ユーザーベースを混在させないように、開発/本番環境で異なるOAuthアプリケーションを使用することをお勧めします。
オブザーバビリティ
現在のユーザーの詳細をオブザーバビリティツールに渡すには、Auth.js が提供するコールバックを使用できます。たとえば、session
コールバックでは、user.id
を Sentry に渡すことができます。
import * as Sentry from "@sentry/browser"
import NextAuth from "next-auth"
export const { handlers, auth, signIn, signOut } = NextAuth({
callbacks: {
session({ session, user }) {
const scope = Sentry.getCurrentScope()
scope.setUser({
id: user.id,
email: user.email,
})
return session
},
},
})
セルフホスト型
Auth.js は、お好みのフレームワークをデプロイできる場所であればどこでもデプロイできます。セルフホスティングについては、フレームワークのドキュメントをご覧ください。
Docker
Docker 環境では、Auth.js の設定で trustHost: true
を設定するか、AUTH_TRUST_HOST
環境変数を true
に設定してください。
弊社のサンプルアプリケーションも Docker を介してホストされています こちら(ソースコード を参照)。以下は、Auth.js を使用する Next.js アプリケーションのサンプル Dockerfile
です。
# syntax=docker/dockerfile:1
# syntax=docker/dockerfile:1
FROM node:20-alpine AS base
# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app
# Install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN corepack enable pnpm && pnpm i --frozen-lockfile
# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.dokyumento.jp/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1
RUN corepack enable pnpm && pnpm build
# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next
# Automatically leverage output traces to reduce image size
# https://nextjs.dokyumento.jp/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
# server.js is created by next build from the standalone output
# https://nextjs.dokyumento.jp/docs/pages/api-reference/next-config-js/output
CMD ["node", "server.js"]
プレビューデプロイのセキュリティ保護
ほとんどの OAuth プロバイダーは、複数のコールバック URL を使用したり、ワイルドカードを使用したりすることはできません。
しかし、Auth.js は **OAuth プロバイダーを使用しても、プレビューデプロイをサポート** します。これは、メインアプリケーションの動的な URL に認証リクエストをプロキシする 1 つのデプロイメントを持つという考え方です。そのため、auth.company.com
のような 1 つの安定したデプロイメントがあり、そこにすべての OAuth プロバイダーの callbackUrl
をポイントし、このアプリケーションは認証が成功すると、ユーザーを https://git-abc123-myapp.vercel.app
のようなプレビューデプロイ URL にリダイレクトします。Auth.js を使用したプレビューデプロイのセキュリティ保護を開始するには、次の手順に従ってください。
- 安定したデプロイメント URL を決定します。たとえば、ビルド間で URL が変更されないデプロイメントなどです。
auth.yourdomain.com
(サブドメインの使用は必須ではありません。メインサイトの URL でもかまいません)。 - プレビュー環境と安定環境の両方で、
AUTH_REDIRECT_PROXY_URL
をその安定したデプロイメント URL に設定します。Auth.js がルートを処理する場所からのパスも含めます(例:https://auth.yourdomain.com/api/auth
)。 - OAuth プロバイダーの設定にある
callbackUrl
を更新して、安定したデプロイメント URL を使用します。たとえば、GitHub の場合はhttps://auth.yourdomain.com/api/auth/callback/github
となります。
豆知識:弊社のサンプルアプリはすべてプロキシ機能を使用しています!
プレビューデプロイをサポートするには、AUTH_SECRET
の値を、安定したデプロイメントと OAuth サポートが必要なデプロイメントで同じにする必要があります。
これはどのように機能しますか?
プレビューデプロイをサポートするために、Auth.js はリダイレクトプロキシサーバーとしてデプロイ間で安定したデプロイメントURLを必要とします。
AUTH_REDIRECT_PROXY_URL
環境変数が設定されている場合にのみ、OAuth コールバックリクエストをプレビューデプロイメント URL にリダイレクトします。
ユーザーがプレビューデプロイメントで OAuth サインインフローを開始すると、その URL は state
クエリパラメーターに保存されますが、redirect_uri
は安定したデプロイメントに設定されます。
次に、OAuth プロバイダーは上記で指定された安定した URL にユーザーをリダイレクトします。これにより、state
パラメーターが検証され、state
が有効な場合、ユーザーはプレビューデプロイメント URL にリダイレクトされます。これは、安定したデプロイメントとプレビューデプロイメントで同じサーバー側の AUTH_SECRET
に依存することでセキュリティが確保されます。