リソースの保護
ルートの保護は、一般的にセッションを確認し、アクティブなセッションが見つからない場合(ログインページへのリダイレクト、または401: 認証されていない
レスポンスの返却など)にアクションを実行することで実現できます。
ページ
auth.ts
またはauth.js
設定ファイルからエクスポートされたNextAuth()
から返されるauth
関数を使用して、セッションオブジェクトを取得できます。
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
キーが追加され、有効なセッションを確認できます。
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
ファイルを作成します。
export { auth as middleware } from "@/auth"
auth.ts
ファイルでauthorized
コールバックを定義します。詳細については、リファレンスドキュメントを参照してください。
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
メソッドをラッパーとして使用することもできます。
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)
}
})
複数のルートに一致させる正規表現を使用することも、特定のルートを除外して残りのルートを保護することもできます。次の例では、ファビコンや静的画像などのパスでのミドルウェアの実行を回避します。
export const config = {
matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
}
ミドルウェアは、matcher
設定エクスポートで定義されたページを保護します。matcherの詳細については、Next.jsドキュメントを参照してください。
認証にはミドルウェアだけに依存しないでください。データのフェッチにできるだけ近い時点で、セッションが常に検証されるようにしてください。