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

Prismaアダプター

リソース

セットアップ

インストール

npm install @prisma/client @auth/prisma-adapter
npm install prisma --save-dev

環境変数

データベースへの接続とデータ取得のため、Prismaは環境変数の設定が必要です。Prismaは接続確立にDATABASE_URL環境変数を使用します。詳細は、ドキュメントを参照してください。

DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA

設定

Prisma ORMのパフォーマンスを向上させるために、プロジェクト全体でPrismaインスタンスが1つだけ作成されるように設定し、必要に応じて任意のファイルからインポートすることができます。これにより、PrismaClientのインスタンスを毎回再作成する必要がなくなります。auth.tsファイルの設定からPrismaインスタンスをインポートできます。

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
⚠️

ミドルウェアまたはその他のEdgeランタイムを使用する場合は、バージョン@prisma/client@5.12.0以上を使用することをお勧めします。詳細については、下記のEdgeとの互換性を参照してください。

./auth.ts
import NextAuth from "next-auth"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/prisma"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [],
})

Edgeとの互換性

Prismaはバージョン5.12.0でEdgeランタイムサポートを提供しました。Edgeドキュメントで詳細を確認できます。特定のデータベースドライバが必要なため、特定の種類のデータベース/ホスティングプロバイダーとのみ互換性があります。開始する前に、サポートされているドライバの一覧を確認してください。next-authとPrismaを使用してEdge環境で動作するAuth.jsアプリケーションの例はこちらにあります。

Edgeとの互換性に関する詳細については、Edge互換性ガイドを参照してください。

auth.ts設定を2つのファイルに分割する、元のデータベースEdgeランタイム対応策を以下に示します。

旧Edge対応策

現在、PrismaはVercelなどのEdgeランタイムとの完全な互換性はまだ開発中です。追跡中の問題、および5.9.1変更ログにおけるPrismaによる早期Edgeサポートに関する発表を参照してください。この問題に対処するには、2つのオプションがあります。

  • PrismaのAccelerate機能を使用する
  • 対応策としてEdge互換性ページに従う。これはjwtセッション戦略を使用し、auth.ts設定を2つのファイルに分割します。

jwtセッション戦略と@prisma/client@5.9.1以上をPrismaで使用する場合、ミドルウェアでデータベースクエリを実行しないことを確認する以外に追加の変更は必要ありません。

@prisma/client@5.9.1以降、Prismaはインスタンス化時ではなくクエリ実行時にEdgeランタイムとの非互換性に関するエラーをスローします。したがって、ミドルウェアで使用されているファイルにインポートすることが可能です。ただし、ミドルウェア内でクエリを実行しないでください。

スキーマ

Prisma 2.26.0以上が必要です。prisma/schema.prismaに次のモデルを含むスキーマファイルを作成します。

スキーマの適用

これにより、SQLマイグレーションファイルが作成され、実行されます。

npm exec prisma migrate dev

データベース接続文字列をDATABASE_URL環境変数で指定する必要があることに注意してください。これは、プロジェクトルートの.envファイルで設定できます。Prismaは.env.local構文をサポートしていないため、.envという名前である必要があります。詳細は、環境変数に関するドキュメントを参照してください。

Prismaクライアントの生成

prisma migrate dev は Prisma クライアントも生成しますが、手動で再生成する必要がある場合は、次のコマンドを実行できます。

npm exec prisma generate

開発ワークフロー

アプリケーションを開発し、データベーススキーマを変更する際には、Prisma が (1) マイグレーションファイルの生成と基盤となるデータベースへの適用、および (2) 最新の型とモデルメソッドを含む Prisma クライアントのプロジェクトへの再生成を行うため、スキーマに変更を加えるたびに migrate コマンドを実行する必要があります。

npm exec prisma migrate dev

命名規則

混合した snake_casecamelCase のカラム名が問題となる場合、または基盤となるデータベースシステムとの互換性のために、Prisma の @map() 機能 を使用してフィールド名を変更することをお勧めします。これは Auth.js には影響しませんが、好みの命名規則に合わせてカラム名をカスタマイズできます。

たとえば、snake_case と複数形テーブル名への移行などです。

schema.prisma
model Account {
  id                 String  @id @default(cuid())
  userId             String  @map("user_id")
  type               String
  provider           String
  providerAccountId  String  @map("provider_account_id")
  refresh_token      String? @db.Text
  access_token       String? @db.Text
  expires_at         Int?
  token_type         String?
  scope              String?
  id_token           String? @db.Text
  session_state      String?
 
  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
 
  @@unique([provider, providerAccountId])
  @@map("accounts")
}
 
model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique @map("session_token")
  userId       String   @map("user_id")
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
 
  @@map("sessions")
}
 
model User {
  id            String    @id @default(cuid())
  name          String?
  email         String?   @unique
  emailVerified DateTime? @map("email_verified")
  image         String?
  accounts      Account[]
  sessions      Session[]
 
  @@map("users")
}
 
model VerificationToken {
  identifier String
  token      String
  expires    DateTime
 
  @@unique([identifier, token])
  @@map("verification_tokens")
}
Auth.js © Balázs Orbán and Team -2024