File: prisma.md | Updated: 11/15/2025
š NextAuth.js is now part of Better Auth !
This is documentation for NextAuth.js v3, which is no longer actively maintained.
For up-to-date documentation, see the **latest version ** (v4).
Version: v3
On this page
You can also use NextAuth.js with the new experimental Adapter for Prisma
. This version of the Prisma Adapter is not included in the core next-auth package, and must be installed separately.
info
You may have noticed there is a prisma and prisma-legacy adapter. This is due to historical reasons, but the code has mostly converged so that there is no longer much difference between the two. The legacy adapter, however, does have the ability to rename tables which the newer version does not.
To use this Adapter, you need to install Prisma Client, Prisma CLI, and the separate @next-auth/prisma-adapter package:
npm install @prisma/client @next-auth/prisma-adapternpm install prisma --save-dev
Configure your NextAuth.js to use the Prisma Adapter:
pages/api/auth/[...nextauth].js
import NextAuth from "next-auth"import Providers from "next-auth/providers"import { PrismaAdapter } from "@next-auth/prisma-adapter"import { PrismaClient } from "@prisma/client"const prisma = new PrismaClient()export default NextAuth({ providers: [ Providers.Google({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], adapter: PrismaAdapter(prisma),})
tip
While Prisma includes an experimental feature in the migration command that is able to generate SQL from a schema, creating tables and columns using the provided SQL is currently recommended instead as SQL schemas automatically generated by Prisma may differ from the recommended schemas.
Schema for the Prisma Adapter (@next-auth/prisma-adapter)
Setupā
Create a schema file in prisma/schema.prisma similar to this one:
schema.prisma
generator client { provider = "prisma-client-js"}datasource db { provider = "sqlite" url = "file:./dev.db"}model Account { id String @id @default(cuid()) userId String providerType String providerId String providerAccountId String refreshToken String? accessToken String? accessTokenExpires DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id]) @@unique([providerId, providerAccountId])}model Session { id String @id @default(cuid()) userId String expires DateTime sessionToken String @unique accessToken String @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id])}model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt accounts Account[] sessions Session[]}model VerificationRequest { id String @id @default(cuid()) identifier String token String @unique expires DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([identifier, token])}
Once you have saved your schema, use the Prisma CLI to generate the Prisma Client:
npx prisma generate
To configure your database to use the new schema (i.e. create tables and columns) use the prisma migrate command:
npx prisma migrate dev
To generate a schema in this way with the above example code, you will need to specify your database connection string in the environment variable DATABASE_URL. You can do this by setting it in a .env file at the root of your project.
As this feature is experimental in Prisma, it is behind a feature flag. You should check your database schema manually after using this option. See the Prisma documentation
for information on how to use prisma migrate.
Schema Historyā
Changes from the original Prisma Adapter
model Account {- id Int @default(autoincrement()) @id+ id String @id @default(cuid())- compoundId String @unique @map(name: "compound_id")- userId Int @map(name: "user_id")+ userId String+ user User @relation(fields: [userId], references: [id])- providerType String @map(name: "provider_type")+ providerType String- providerId String @map(name: "provider_id")+ providerId String- providerAccountId String @map(name: "provider_account_id")+ providerAccountId String- refreshToken String? @map(name: "refresh_token")+ refreshToken String?- accessToken String? @map(name: "access_token")+ accessToken String?- accessTokenExpires DateTime? @map(name: "access_token_expires")+ accessTokenExpires DateTime?- createdAt DateTime @default(now()) @map(name: "created_at")+ createdAt DateTime @default(now())- updatedAt DateTime @default(now()) @map(name: "updated_at")+ updatedAt DateTime @updatedAt- @@index([providerAccountId], name: "providerAccountId")- @@index([providerId], name: "providerId")- @@index([userId], name: "userId")- @@map(name: "accounts")+ @@unique([providerId, providerAccountId]) } model Session {- id Int @default(autoincrement()) @id+ id String @id @default(cuid())- userId Int @map(name: "user_id")+ userId String+ user User @relation(fields: [userId], references: [id]) expires DateTime- sessionToken String @unique @map(name: "session_token")+ sessionToken String @unique- accessToken String @unique @map(name: "access_token")+ accessToken String @unique- createdAt DateTime @default(now()) @map(name: "created_at")+ createdAt DateTime @default(now())- updatedAt DateTime @default(now()) @map(name: "updated_at")+ updatedAt DateTime @updatedAt-- @@map(name: "sessions") } model User {- id Int @default(autoincrement()) @id+ id String @id @default(cuid()) name String? email String? @unique- emailVerified DateTime? @map(name: "email_verified")+ emailVerified DateTime? image String?+ accounts Account[]+ sessions Session[]- createdAt DateTime @default(now()) @map(name: "created_at")+ createdAt DateTime @default(now())- updatedAt DateTime @default(now()) @map(name: "updated_at")+ updatedAt DateTime @updatedAt- @@map(name: "users") } model VerificationRequest {- id Int @default(autoincrement()) @id+ id String @id @default(cuid()) identifier String token String @unique expires DateTime- createdAt DateTime @default(now()) @map(name: "created_at")+ createdAt DateTime @default(now())- updatedAt DateTime @default(now()) @map(name: "updated_at")+ updatedAt DateTime @updatedAt- @@map(name: "verification_requests")+ @@unique([identifier, token]) }