Skip to content
Migrating from NextAuth.js v4? Read our migration guide.
API reference
@auth/prisma-adapter

@auth/prisma-adapter

Official Prisma adapter for Auth.js / NextAuth.js.

Installation

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

PrismaAdapter()

PrismaAdapter(prisma): Adapter

Setup

Add this adapter to your auth.ts Auth.js configuration object:

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

Create the Prisma schema from scratch

You need to use at least Prisma 2.26.0. Create a schema file in prisma/schema.prisma similar to this one:

This schema is adapted for use in Prisma and based upon our main schema

schema.prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
  shadowDatabaseUrl = env("SHADOW_DATABASE_URL") // Only needed when using a cloud provider that doesn't support the creation of new databases, like Heroku. Learn more: https://pris.ly/d/migrate-shadow
}
 
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["referentialActions"] // You won't need this in Prisma 3.X or higher.
}
 
model Account {
  id                 String  @id @default(cuid())
  userId             String
  type               String
  provider           String
  providerAccountId  String
  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])
}
 
model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}
 
model User {
  id            String    @id @default(cuid())
  name          String?
  email         String?   @unique
  emailVerified DateTime?
  image         String?
  accounts      Account[]
  sessions      Session[]
}
 
model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime
 
  @@unique([identifier, token])
}

When using the MySQL connector for Prisma, the Prisma String type gets mapped to varchar(191) which may not be long enough to store fields such as id_token in the Account model. This can be avoided by explicitly using the Text type with @db.Text.

Create the Prisma schema with prisma migrate

This will create an SQL migration file and execute it:

npx prisma migrate dev

Note that 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.

To learn more about Prisma Migrate, check out the Migrate docs.

Generating the Prisma Client

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

MongoDB support

Prisma supports MongoDB, and so does Auth.js. Following the instructions of the Prisma documentation on the MongoDB connector, things you have to change are:

  1. Make sure that the id fields are mapped correctly
id  String  @id @default(auto()) @map("_id") @db.ObjectId
  1. The Native database type attribute to @db.String from @db.Text and userId to @db.ObjectId.
user_id            String   @db.ObjectId
refresh_token      String?  @db.String
access_token       String?  @db.String
id_token           String?  @db.String

Everything else should be the same.

Naming Conventions

If mixed snake_case and camelCase column names is an issue for you and/or your underlying database system, we recommend using Prisma’s @map()(see the documentation here) feature to change the field names. This won’t affect Auth.js, but will allow you to customize the column names to whichever naming convention you wish.

For example, moving to snake_case and plural table names.

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[]
  authenticators Authenticator[]
 
  @@map("users")
}
 
model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime
 
  @@unique([identifier, token])
  @@map("verificationtokens")
}
 
model Authenticator {
  id                   String  @id @default(cuid())
  credentialID         String  @unique
  userId               String
  providerAccountId    String
  credentialPublicKey  String
  counter              Int
  credentialDeviceType String
  credentialBackedUp   Boolean
  transports           String?
 
  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}

Parameters

ParameterType
prismaPrismaClient<PrismaClientOptions, never, DefaultArgs> | DynamicClientExtensionThis<TypeMap<InternalArgs & InternalArgs<{}, {}, {}, {}>>, TypeMapCb, InternalArgs<{}, {}, {}, {}>>

Returns

Adapter

Auth.js © Balázs Orbán and Team - 2024