コンテンツにスキップ
NextAuth.js v4から移行しますか? 移行ガイド.
はじめにNextAuth.js v5への移行

アップグレードガイド (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()

  • どこでも認証できる単一のメソッド
  • getServerSessiongetSessionwithAuthgetToken、および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として渡すことを避けることでした。これを実現するために、設定ファイルをリポジトリのルートに移動し、他の場所で使用できる必要な関数をエクスポートすることにしました(authsignInsignOuthandlersなど)。

設定ファイルは、以前のルートベースのAuth.js設定と非常によく似ているはずです。ただし、今はリポジトリのルートにある新しいファイルで行っており、他の場所で使用するためにメソッドをエクスポートしています。以下は、v5設定ファイルの簡単な例です。

./auth.ts
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],
})

新しい設定について注意すべき点

  1. これは、リポジトリのルートにあるauth.tsという名前のファイルになりました。技術的には何でも名前を付けることができますが、アプリ全体でここからエクスポートされたメソッドをインポートすることになるため、短く保つことをお勧めします。
  2. プロバイダーの定義をインポートするために、@auth/coreをインストールする必要はありません。これらはnext-auth自体から提供されます。
  3. NextAuth()関数に渡される設定オブジェクトは、以前と同じです。
  4. NextAuth()関数呼び出しからエクスポートされる返されたメソッドは新しく、アプリケーションの他の場所で必要になります。

APIルート(pages/api/auth/[...nextauth].ts / app/api/auth/[...nextauth]/route.ts)に含まれていた古い設定ファイルは、非常に短くなります。これらのエクスポートは、App Router APIルートで使用するように設計されていますが、徐々に移行している場合は、アプリの残りの部分をPages Routerに留めることができます!

app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth"
export const { GET, POST } = handlers

サーバーサイドでの認証

Auth.jsには、過去にサーバーサイドで認証を行うためのいくつかの異なる方法があったため、これを可能な限り簡略化しようとしました。

Next.jsコンポーネントがデフォルトでサーバーファーストになり、標準のWeb APIの使用への投資のおかげで、ほとんどの場合、認証プロセスを単一のauth()関数呼び出しに簡略化することができました。

認証方法

変更の概要については、以下の表を参照してください。その下には、さまざまな環境およびコンテキストで新しいauth()メソッドを使用する方法のdiffの例があります。

場所v4v5
サーバーコンポーネント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) 呼び出し
getServerSidePropsgetServerSession(ctx.req, ctx.res, authOptions)auth(ctx) 呼び出し
getServerSidePropsgetToken(ctx.req) (セッションローテーションなし)auth(req, res) 呼び出し

詳細

Auth.js v4 は、getServerSession を介してサーバーコンポーネントでのセッションの読み取りを以前からサポートしていました。これは、同じ auth() 関数に簡略化されました。

app/page.tsx
- 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 環境でデータベースにアクセスしようとしないように構成を分割する例です。

💡

次のファイル名は単なる慣例であり、好きなように名前を付けることができます。

  1. auth.config.ts ファイルを作成し、Auth.js の設定オプションを含むオブジェクトをエクスポートします。ここには、アダプターに依存しないすべての共通設定を配置できます。これは構成オブジェクトのみをエクスポートしていることに注意してください。ここでは NextAuth() を呼び出していません。
auth.config.ts
import GitHub from "next-auth/providers/github"
import type { NextAuthConfig } from "next-auth"
 
export default { providers: [GitHub] } satisfies NextAuthConfig
  1. 次に、auth.ts ファイルを作成し、アダプターと jwt セッション戦略を追加します。これは、ミドルウェア以外でアプリケーションの残りの部分からインポートする auth.ts 構成ファイルです。
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,
})
  1. ミドルウェアファイルで、最初の auth.config.ts ファイルから構成オブジェクトをインポートし、それを使用して Auth.js を遅延初期化します。事実上、すべての共通オプションを使用して Auth.js を個別に初期化しますが、Edge 非互換のアダプターは使用しません
middleware.ts
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

  • NextAuthOptionsNextAuthConfig に名前が変更されました
  • 次の型は、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サーバーでチャットしてください。

Auth.js © Balázs Orbán およびチーム -2024