ホームページ >ウェブフロントエンド >jsチュートリアル >Next.js App Router での Auth.js によるユーザー認証
npm install next-auth@beta
// env.local AUTH_SECRET=GENERATETD_RANDOM_VALUE
// src/auth.ts import NextAuth from "next-auth" export const config = { providers: [], } export const { handlers, signIn, signOut, auth } = NextAuth(config)
Auth.js におけるこれは src フォルダー内に配置する必要があります
プロバイダー は、ユーザーのサインインに使用できるサービスを意味します。ユーザーがサインインするには 4 つの方法があります。
https://authjs.dev/reference/nextjs#providers
// src/app/api/auth/[...nextauth]/route.ts import { handlers } from "@/auth" // Referring to the auth.ts we just created export const { GET, POST } = handlers
このファイルは、Next.js App Router でルート ハンドラーを設定するために使用されます。
// src/middleware.ts import { auth } from "@/auth" export default auth((req) => { // Add your logic here } export const config = { matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"], // It's default setting }
srcフォルダー内にを書き込みます。
src フォルダーの外に書き込むとミドルウェアが動作しません。
ミドルウェアは、リクエストが完了する前にコードを実行できるようにする機能です。これは、アプリケーション全体でのルートの保護と認証の処理に特に役立ちます。
Matcher は、ミドルウェアがどのルートに適用されるかを指定するための構成オプションです。 必要なルートでのみミドルウェアを実行することでパフォーマンスを最適化します。
マッチャーの例: ['/dashboard/:path*'] は、ダッシュボード ルートにのみミドルウェアを適用します。
https://authjs.dev/getting-started/session-management/protecting?framework=express#nextjs-middleware
// src/app/page.tsx import { auth } from "@/auth" import { redirect } from "next/navigation" export default async function page() { const session = await auth() if (!session) { redirect('/login') } return ( <div> <h1>Hello World!</h1> <img src={session.user.image} alt="User Avatar" /> </div> ) }
// src/app/page.tsx "use client" import { useSession } from "next-auth/react" import { useRouter } from "next/navigation" export default async function page() { const { data: session } = useSession() const router = useRouter() if (!session.user) { router.push('/login') } return ( <div> <h1>Hello World!</h1> <img src={session.user.image} alt="User Avatar" /> </div> ) } // src/app/layout.tsx import type { Metadata } from "next"; import "./globals.css"; import { SessionProvider } from "next-auth/react" export const metadata: Metadata = { title: "Create Next App", description: "Generated by create next app", }; export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return ( <html lang="en"> <body> <SessionProvider> {children} </SessionProvider> </body> </html> ); }
/src /app /api /auth [...nextauth] /route.ts // Route Handler layout.tsx page.tsx auth.ts // Provider, Callback, Logic etc middleware.ts // A function before request
// prisma/schema.prisma model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? password String? accounts Account[] sessions Session[] } model Account { // ... (standard Auth.js Account model) } model Session { // ... (standard Auth.js Session model) } // ... (other necessary models)
// src/lib/prisma.ts import { PrismaClient } from "@prisma/client" const globalForPrisma = globalThis as unknown as { prisma: PrismaClient } export const prisma = globalForPrisma.prisma || new PrismaClient() if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma
認証情報 は、認証のコンテキストにおいて、ユーザーが提供する情報 (通常はユーザー名 (または電子メール) とパスワード) を使用してユーザーの身元を確認する方法 を指します。
src/auth.ts に認証情報を追加できます。
npm install next-auth@beta
アダプター:
秘密:
ページ:
セッション:
コールバック:
jwt コールバック:
セッションコールバック:
GCP Console から新しい OAuth クライアント ID を作成する > API とサービス >資格情報
作成したら、後で使用できるようにクライアント ID とクライアント シークレットを保存します。
ローカルで作業する場合は、http://localhost:3000/api/auth/callback/google を設定します
実稼働環境では、http://localhost:3000 を https://------ に置き換えるだけです。
// env.local AUTH_SECRET=GENERATETD_RANDOM_VALUE
// src/auth.ts import NextAuth from "next-auth" export const config = { providers: [], } export const { handlers, signIn, signOut, auth } = NextAuth(config)
https://authjs.dev/getting-started/authentication/oauth
// src/app/api/auth/[...nextauth]/route.ts import { handlers } from "@/auth" // Referring to the auth.ts we just created export const { GET, POST } = handlers
// src/middleware.ts import { auth } from "@/auth" export default auth((req) => { // Add your logic here } export const config = { matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"], // It's default setting }
// src/app/page.tsx import { auth } from "@/auth" import { redirect } from "next/navigation" export default async function page() { const session = await auth() if (!session) { redirect('/login') } return ( <div> <h1>Hello World!</h1> <img src={session.user.image} alt="User Avatar" /> </div> ) }
// src/app/page.tsx "use client" import { useSession } from "next-auth/react" import { useRouter } from "next/navigation" export default async function page() { const { data: session } = useSession() const router = useRouter() if (!session.user) { router.push('/login') } return ( <div> <h1>Hello World!</h1> <img src={session.user.image} alt="User Avatar" /> </div> ) } // src/app/layout.tsx import type { Metadata } from "next"; import "./globals.css"; import { SessionProvider } from "next-auth/react" export const metadata: Metadata = { title: "Create Next App", description: "Generated by create next app", }; export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return ( <html lang="en"> <body> <SessionProvider> {children} </SessionProvider> </body> </html> ); }
/src /app /api /auth [...nextauth] /route.ts // Route Handler layout.tsx page.tsx auth.ts // Provider, Callback, Logic etc middleware.ts // A function before request
// prisma/schema.prisma model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? password String? accounts Account[] sessions Session[] } model Account { // ... (standard Auth.js Account model) } model Session { // ... (standard Auth.js Session model) } // ... (other necessary models)
以上がNext.js App Router での Auth.js によるユーザー認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。