アップグレードガイド (NextAuth.js v5)
このガイドは、Next.jsのユーザー向けのnext-auth
のアップグレードにのみ適用されます。next-auth@5
にアップグレードしない場合は、次のセクションであるインストールに進んでください。
NextAuth.jsバージョン5は、next-auth
パッケージの大幅な書き直しであり、可能な限り破壊的な変更は少なくなるように導入しました。それ以外については、このドキュメントが移行プロセスを案内します。
beta
タグを使用して、最新バージョンのnext-auth
をインストールすることから始めましょう。
npm install next-auth@beta
新機能
主な変更点
- App Routerファースト(
pages/
も引き続きサポート) - プレビューデプロイでのOAuthサポート(詳しくはこちら)
- シンプルなセットアップ(共有設定、推論された環境変数)
- プロバイダーでの新しい
account()
コールバック(account()
ドキュメント) - Edge互換
ユニバーサル auth()
- どこでも認証できる単一のメソッド
getServerSession
、getSession
、withAuth
、getToken
、およびuseSession
の代わりにauth()
を使用します(詳しくはこちら)
破壊的な変更
- Auth.jsは、より厳密なOAuth/OIDC仕様準拠を備えた
@auth/core
に基づいて構築されており、既存のOAuthプロバイダーの一部が破損する可能性があります。詳細については、未解決の問題をご覧ください。 - OAuth 1.0のサポートは非推奨になりました。
- 必要なNext.jsの最小バージョンは、14.0になりました。
- インポート
next-auth/next
が置き換えられました。詳細については、サーバーサイドでの認証を参照してください。 - インポート
next-auth/middleware
が置き換えられました。詳細については、サーバーサイドでの認証を参照してください。 idToken: boolean
オプションがfalse
に設定されている場合、IDトークンは完全に無効になりません。代わりに、最終的なユーザーデータのためにuserinfo_endpoint
にもアクセスするようにnext-auth
に指示します。以前は、idToken: false
にすると、id_token
の有効性のチェックを一切行わなくなりました。
移行
設定ファイル
私たちの目標の1つは、設定を1つのファイルからエクスポートし、アプリケーション全体でauthOptions
として渡すことを避けることでした。これを実現するために、設定ファイルをリポジトリのルートに移動し、他の場所で使用できる必要な関数をエクスポートすることにしました(auth
、signIn
、signOut
、handlers
など)。
設定ファイルは、以前のルートベースのAuth.js設定と非常によく似ているはずです。ただし、今はリポジトリのルートにある新しいファイルで行っており、他の場所で使用するためにメソッドをエクスポートしています。以下は、v5設定ファイルの簡単な例です。
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
import Google from "next-auth/providers/google"
export const { auth, handlers, signIn, signOut } = NextAuth({
providers: [GitHub, Google],
})
新しい設定について注意すべき点
- これは、リポジトリのルートにある
auth.ts
という名前のファイルになりました。技術的には何でも名前を付けることができますが、アプリ全体でここからエクスポートされたメソッドをインポートすることになるため、短く保つことをお勧めします。 - プロバイダーの定義をインポートするために、
@auth/core
をインストールする必要はありません。これらはnext-auth
自体から提供されます。 NextAuth()
関数に渡される設定オブジェクトは、以前と同じです。NextAuth()
関数呼び出しからエクスポートされる返されたメソッドは新しく、アプリケーションの他の場所で必要になります。
APIルート(pages/api/auth/[...nextauth].ts
/ app/api/auth/[...nextauth]/route.ts
)に含まれていた古い設定ファイルは、非常に短くなります。これらのエクスポートは、App Router APIルートで使用するように設計されていますが、徐々に移行している場合は、アプリの残りの部分をPages Routerに留めることができます!
import { handlers } from "@/auth"
export const { GET, POST } = handlers
サーバーサイドでの認証
Auth.jsには、過去にサーバーサイドで認証を行うためのいくつかの異なる方法があったため、これを可能な限り簡略化しようとしました。
Next.jsコンポーネントがデフォルトでサーバーファーストになり、標準のWeb APIの使用への投資のおかげで、ほとんどの場合、認証プロセスを単一のauth()
関数呼び出しに簡略化することができました。
認証方法
変更の概要については、以下の表を参照してください。その下には、さまざまな環境およびコンテキストで新しいauth()
メソッドを使用する方法のdiff
の例があります。
場所 | v4 | v5 |
---|---|---|
サーバーコンポーネント | getServerSession(authOptions) | auth() 呼び出し |
ミドルウェア | withAuth(middleware, authOptionsのサブセット) ラッパー | auth のエクスポート / auth() ラッパー |
クライアントコンポーネント | useSession() フック | useSession() フック |
ルートハンドラー | 以前はサポートされていません | auth() ラッパー |
APIルート(Edge) | 以前はサポートされていません | auth() ラッパー |
APIルート(Node.js) | getServerSession(req, res, authOptions) | auth(req, res) 呼び出し |
APIルート(Node.js) | getToken(req) (セッションローテーションなし) | auth(req, res) 呼び出し |
getServerSideProps | getServerSession(ctx.req, ctx.res, authOptions) | auth(ctx) 呼び出し |
getServerSideProps | getToken(ctx.req) (セッションローテーションなし) | auth(req, res) 呼び出し |
詳細
Auth.js v4 は、getServerSession
を介してサーバーコンポーネントでのセッションの読み取りを以前からサポートしていました。これは、同じ auth()
関数に簡略化されました。
- import { authOptions } from "pages/api/auth/[...nextauth]"
- import { getServerSession } from "next-auth/next"
+ import { auth } from "@/auth"
export default async function Page() {
- const session = await getServerSession(authOptions)
+ const session = await auth()
return (<p>Welcome {session?.user.name}!</p>)
}
アダプター
アダプターパッケージ
next-auth
v5 以降では、@next-auth/*-adapter
ではなく、@auth/*-adapter
スコープからデータベースアダプターをインストールする必要があります。データベースアダプターは Next.js の機能に依存しないため、この新しいスコープに移動する方が理にかなっていました。
- npm install @next-auth/prisma-adapter
+ npm install @auth/prisma-adapter
公式アダプターのリストについてはアダプターのページを参照するか、独自の作成方法については「データベースアダプターの作成」ガイドを参照してください。
データベースの移行
NextAuth.js v5 は、データベーススキーマに破壊的な変更を導入しません。ただし、OAuth 1.0 のサポートが廃止されたため、(以前はオプションだった) oauth_token_secret
および oauth_token
フィールドは、使用していない場合は account
テーブルから削除できます。
さらに、以前は一般的ではなかった GitHub の refresh_token_expires_in
フィールドのようなフィールドは、account
テーブルに追加する必要がありました。これはもはや当てはまらず、使用していない場合は削除できます。使用する場合は、新しいaccount()
コールバック経由で返すようにしてください。
Edge 互換性
Auth.js は厳密に標準のWeb APIを使用しているため(したがって、Web API をサポートするあらゆる環境で実行できます)、依存している一部のライブラリや ORM(オブジェクトリレーショナルマッピング)パッケージはまだ準備ができていない可能性があります。この場合、認証構成を複数のファイルに分割できます。
Auth.js は 2 つのセッション戦略をサポートしています。アダプターを使用している場合、デフォルトは database
戦略になります。データベースとそのアダプターが Edge ランタイム/インフラストラクチャと互換性がない限り、"database"
セッション戦略を使用することはできません。
たとえば、Edge ランタイムと互換性のない ORM/ライブラリに依存するアダプターを使用している場合、以下は jwt
戦略を強制し、ライブラリがミドルウェアなどの Edge 環境でデータベースにアクセスしようとしないように構成を分割する例です。
次のファイル名は単なる慣例であり、好きなように名前を付けることができます。
auth.config.ts
ファイルを作成し、Auth.js の設定オプションを含むオブジェクトをエクスポートします。ここには、アダプターに依存しないすべての共通設定を配置できます。これは構成オブジェクトのみをエクスポートしていることに注意してください。ここではNextAuth()
を呼び出していません。
import GitHub from "next-auth/providers/github"
import type { NextAuthConfig } from "next-auth"
export default { providers: [GitHub] } satisfies NextAuthConfig
- 次に、
auth.ts
ファイルを作成し、アダプターとjwt
セッション戦略を追加します。これは、ミドルウェア以外でアプリケーションの残りの部分からインポートするauth.ts
構成ファイルです。
import NextAuth from "next-auth"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { PrismaClient } from "@prisma/client"
import authConfig from "./auth.config"
const prisma = new PrismaClient()
export const { auth, handlers, signIn, signOut } = NextAuth({
adapter: PrismaAdapter(prisma),
session: { strategy: "jwt" },
...authConfig,
})
- ミドルウェアファイルで、最初の
auth.config.ts
ファイルから構成オブジェクトをインポートし、それを使用して Auth.js を遅延初期化します。事実上、すべての共通オプションを使用して Auth.js を個別に初期化しますが、Edge 非互換のアダプターは使用しません。
import authConfig from "./auth.config"
import NextAuth from "next-auth"
// Use only one of the two middleware options below
// 1. Use middleware directly
// export const { auth: middleware } = NextAuth(authConfig)
// 2. Wrapped middleware option
const { auth } = NextAuth(authConfig)
export default auth(async function middleware(req: NextRequest) {
// Your custom middleware logic goes here
})
上記は単なる例です。主な考え方は、Edge と互換性のある構成部分をそれ以外の部分から分離し、ミドルウェア/Edge ページ/ルートでは Edge 互換の部分のみをインポートすることです。この回避策の詳細については、たとえばPrisma ドキュメントを参照してください。
ライブラリ/データベース/ORM のメンテナーに連絡して、Edge ランタイム/インフラストラクチャのサポートを計画しているかどうかを確認してください。
Edge の互換性と Auth.js がこれにどのように適合するかについての一般的な詳細については、Edge 互換性に関する記事を参照してください。
環境変数
環境変数への破壊的な変更はありませんが、不要なものをいくつか整理しました。したがって、環境変数に関するベストプラクティスをいくつか共有したいと思います。
- すべての環境変数は
AUTH_
で始まる必要があります。NEXTAUTH_
はもはや使用されていません。 - プロバイダー
secret
/clientId
変数をこの構文 (つまり、AUTH_GITHUB_SECRET
およびAUTH_GITHUB_ID
) を使用して名前を付けると、自動的に検出されるため、プロバイダーの設定に明示的に渡す必要はありません。 NEXTAUTH_URL
/AUTH_URL
は、ほとんどの環境では厳密には必要なくなりました。リクエストヘッダーに基づいてホストを自動検出します。AUTH_TRUST_HOST
環境変数は、Auth.js の構成でtrustHost: true
を設定するのと同じ目的を果たします。これは、プロキシの背後で Auth.js を実行している場合に必要です。true に設定すると、プロキシによってアプリに渡されるX-Forwarded-Host
およびX-Forwarded-Proto
ヘッダーを信頼して、ホスト URL (AUTH_URL
) を自動検出しますAUTH_SECRET
環境変数は、本当に必要な唯一の変数です。環境変数を設定した場合、この値をsecret
構成オプションとして構成に追加で渡す必要はありません。
環境変数と環境変数の推論の詳細については、環境変数のページを参照してください。
TypeScript
NextAuthOptions
はNextAuthConfig
に名前が変更されました- 次の型は、
next-auth
や@auth/sveltekit
のようなすべてのフレームワークパッケージからエクスポートされるようになりました
export type {
Account,
DefaultSession,
Profile,
Session,
User,
} from "@auth/core/types"
- すべての
Adapter
型は、next-auth/adapters
、@auth/sveltekit/adapters
など、フレームワークパッケージの/adapters
からも再エクスポートされます。
Cookie
next-auth
プレフィックスはauthjs
に名前が変更されました。
まとめ
皆様にとって、この移行がスムーズに進むことを願っています!ご質問がある場合や、どこかに行き詰まった場合は、GitHub で新しい issue を作成するか、Discordサーバーでチャットしてください。