コンテンツへスキップ
NextAuth.js v4からの移行?こちらを ご確認ください.

リソースの保護

ルートの保護は、一般的にセッションを確認し、アクティブなセッションが見つからない場合(ログインページへのリダイレクト、または401: 認証されていないレスポンスの返却など)にアクションを実行することで実現できます。

ページ

auth.tsまたはauth.js設定ファイルからエクスポートされたNextAuth()から返されるauth関数を使用して、セッションオブジェクトを取得できます。

app/server/page.tsx
import { auth } from "@/auth"
 
export default async function Page() {
  const session = await auth()
  if (!session) return <div>Not authenticated</div>
 
  return (
    <div>
      <pre>{JSON.stringify(session, null, 2)}</pre>
    </div>
  )
}

APIルート

さまざまなフレームワークでのAPIルートの保護も、authエクスポートを使用して実行できます。

Next.jsでは、auth関数を使用してAPIルートハンドラーをラップできます。リクエストパラメーターにはauthキーが追加され、有効なセッションを確認できます。

./app/api/admin/route.ts
import { auth } from "@/auth"
import { NextResponse } from "next/server"
 
export const GET = auth(function GET(req) {
  if (req.auth) return NextResponse.json(req.auth)
  return NextResponse.json({ message: "Not authenticated" }, { status: 401 })
})

Next.jsミドルウェア

Next.js 12以降では、ページのセットを保護する最も簡単な方法は、ミドルウェアファイルを使用することです。ルートページディレクトリに次の内容のmiddleware.tsファイルを作成します。

middleware.ts
export { auth as middleware } from "@/auth"

auth.tsファイルでauthorizedコールバックを定義します。詳細については、リファレンスドキュメントを参照してください。

auth.ts
import NextAuth from "next-auth"
 
export const { auth, handlers } = NextAuth({
  callbacks: {
    authorized: async ({ auth }) => {
      // Logged in users are authenticated, otherwise redirect to login page
      return !!auth
    },
  },
})

ミドルウェア内でより多くのロジックを実装したい場合は、authメソッドをラッパーとして使用することもできます。

middleware.ts
import { auth } from "@/auth"
 
export default auth((req) => {
  if (!req.auth && req.nextUrl.pathname !== "/login") {
    const newUrl = new URL("/login", req.nextUrl.origin)
    return Response.redirect(newUrl)
  }
})

複数のルートに一致させる正規表現を使用することも、特定のルートを除外して残りのルートを保護することもできます。次の例では、ファビコンや静的画像などのパスでのミドルウェアの実行を回避します。

middleware.ts
export const config = {
  matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
}

ミドルウェアは、matcher設定エクスポートで定義されたページを保護します。matcherの詳細については、Next.jsドキュメントを参照してください。

💡

認証にはミドルウェアだけに依存しないでください。データのフェッチにできるだけ近い時点で、セッションが常に検証されるようにしてください。

Auth.js © Balázs Orbán and Team -2024