ホームページ ウェブフロントエンド jsチュートリアル Next.js App Router での Auth.js によるユーザー認証

Next.js App Router での Auth.js によるユーザー認証

Nov 12, 2024 am 03:05 AM

目次

初期設定

  • インストール
  • 設定する
    • NextAuthConfig 設定
    • ルートハンドラーのセットアップ
    • ミドルウェア
    • サーバー側コンポーネントでセッションを取得
    • クライアント側コンポーネントでセッションを取得
  • フォルダー構造

認証の実装: 認証情報と Google OAuth

  • プリズマのセットアップ
  • 資格情報
  • Google OAuth プロバイダーの追加
    • Google OAuth アプリケーションの設定
    • リダイレクト URI の設定
    • 環境変数のセットアップ
    • セットアッププロバイダー
  • ログインとサインアップ ページの作成
  • フォルダー構造

初期設定

インストール

npm install next-auth@beta
ログイン後にコピー
ログイン後にコピー
// env.local
AUTH_SECRET=GENERATETD_RANDOM_VALUE
ログイン後にコピー
ログイン後にコピー

設定する

NextAuthConfig 設定

// src/auth.ts
import NextAuth from "next-auth"

export const config = {
  providers: [],
}

export const { handlers, signIn, signOut, auth } = NextAuth(config)
ログイン後にコピー
ログイン後にコピー

これは src フォルダー内に配置する必要があります

Auth.js における

プロバイダー は、ユーザーのサインインに使用できるサービスを意味します。ユーザーがサインインするには 4 つの方法があります。

  • 組み込みの OAuth プロバイダー (例: Github、Google など) の使用
  • カスタム OAuth プロバイダーの使用
  • メールの使用
  • 資格情報の使用

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
ログイン後にコピー
ログイン後にコピー

認証の実装: 認証情報と Google OAuth

プリズマのセットアップ

// 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
ログイン後にコピー
ログイン後にコピー

アダプター:

  • 認証システムをデータベースまたはデータ ストレージ ソリューションに接続するモジュール。

秘密:

  • これは、トークンのハッシュ、Cookie の署名/暗号化、暗号キーの生成に使用されるランダムな文字列です。
  • これはセキュリティにとって非常に重要であるため、秘密にしておく必要があります。
  • この場合、環境変数 AUTH_SECRET を使用して設定されます。

ページ:

  • このオブジェクトを使用すると、認証ページの URL をカスタマイズできます。
  • この例では、signIn: '/login' は、サインイン ページがデフォルトの '/api/auth/signin' ではなく '/login' ルートにあることを意味します。

セッション:

  • これにより、セッションの処理方法が構成されます。
  • 戦略: 「jwt」は、データベース セッションではなくセッション管理に JSON Web トークンが使用されることを意味します。

コールバック:

  • これらは認証フローのさまざまなポイントで呼び出される関数であり、プロセスをカスタマイズできます。

jwt コールバック:

  • これは、JWT が作成または更新されるときに実行されます。
  • コードでは、ユーザー情報 (ID、電子メール、名前) をトークンに追加しています。

セッションコールバック:

  • これはセッションがチェックされるたびに実行されます。
  • コードは、トークンからセッション オブジェクトにユーザー情報を追加しています。

Google OAuth プロバイダーの追加

Google OAuthアプリケーションの設定

GCP Console から新しい OAuth クライアント ID を作成する > API とサービス >資格情報

User Authentication with Auth.js in Next.js App Router

作成したら、後で使用できるようにクライアント ID とクライアント シークレットを保存します。

リダイレクトURIの設定

ローカルで作業する場合は、http://localhost:3000/api/auth/callback/google を設定します

実稼働環境では、http://localhost:3000 を https://------ に置き換えるだけです。

User Authentication with Auth.js in Next.js App Router

環境変数のセットアップ

// 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScriptの文字列文字を交換します

jQuery日付が有効かどうかを確認します jQuery日付が有効かどうかを確認します Mar 01, 2025 am 08:51 AM

jQuery日付が有効かどうかを確認します

jQueryは要素のパディング/マージンを取得します jQueryは要素のパディング/マージンを取得します Mar 01, 2025 am 08:53 AM

jQueryは要素のパディング/マージンを取得します

10 jQuery Accordionsタブ 10 jQuery Accordionsタブ Mar 01, 2025 am 01:34 AM

10 jQuery Accordionsタブ

10 jqueryプラグインをチェックする価値があります 10 jqueryプラグインをチェックする価値があります Mar 01, 2025 am 01:29 AM

10 jqueryプラグインをチェックする価値があります

ノードとHTTPコンソールを使用したHTTPデバッグ ノードとHTTPコンソールを使用したHTTPデバッグ Mar 01, 2025 am 01:37 AM

ノードとHTTPコンソールを使用したHTTPデバッグ

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

カスタムGoogle検索APIセットアップチュートリアル

jQueryはscrollbarをdivに追加します jQueryはscrollbarをdivに追加します Mar 01, 2025 am 01:30 AM

jQueryはscrollbarをdivに追加します

See all articles