mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
* docs: beta initial commit * docs(oauth): finish initial tutorial * docs(oauth-tutorial): finish guide * docs(docusaurus): just log broken links * docs: re-organising beta * docs(beta): sort documents for sorting * docs: more re-structure * docs: more re-structure (2) * fix: more WIP * fix: more WIP * chore: more updates * chore: wip * chore: wip * fix lock file * docs(getting-started): credentials * chore: remove json-server file * chore: cleanup * remove mongodb from dev app * chore: cleanup * revert * chore: cleanup * chore: more cleanup changes Co-authored-by: Balázs Orbán <info@balazsorban.com>
212 lines
6.2 KiB
Markdown
212 lines
6.2 KiB
Markdown
---
|
|
id: prisma
|
|
title: Prisma
|
|
---
|
|
|
|
# Prisma
|
|
|
|
To use this Adapter, you need to install Prisma Client, Prisma CLI, and the separate `@next-auth/prisma-adapter` package:
|
|
|
|
```bash npm2yarn
|
|
npm install next-auth @prisma/client @next-auth/prisma-adapter
|
|
npm install prisma --save-dev
|
|
```
|
|
|
|
Configure your NextAuth.js to use the Prisma Adapter:
|
|
|
|
```javascript title="pages/api/auth/[...nextauth].js"
|
|
import NextAuth from "next-auth"
|
|
import GoogleProvider from "next-auth/providers/google"
|
|
import { PrismaAdapter } from "@next-auth/prisma-adapter"
|
|
import { PrismaClient } from "@prisma/client"
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
export default NextAuth({
|
|
adapter: PrismaAdapter(prisma),
|
|
providers: [
|
|
GoogleProvider({
|
|
clientId: process.env.GOOGLE_CLIENT_ID,
|
|
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
}),
|
|
],
|
|
})
|
|
```
|
|
|
|
Schema for the Prisma Adapter (`@next-auth/prisma-adapter`)
|
|
|
|
## Setup
|
|
|
|
### Create the Prisma schema
|
|
|
|
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](/adapters/models)
|
|
|
|
```json title="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/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])
|
|
}
|
|
```
|
|
|
|
:::note
|
|
When using the MySQL connector for Prisma, the [Prisma `String` type](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string) 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 database schema with Prisma Migrate
|
|
|
|
```
|
|
npx prisma migrate dev
|
|
```
|
|
|
|
This will create an SQL migration file and execute it.
|
|
|
|
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](https://www.prisma.io/migrate), check out the [Migrate docs](https://www.prisma.io/docs/concepts/components/prisma-migrate).
|
|
|
|
### Generate 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
|
|
|
|
Prisma supports MongoDB, and so does NextAuth.js. Following the instructions of the [Prisma documentation](https://www.prisma.io/docs/concepts/database-connectors/mongodb) on the MongoDB connector, things you have to change are:
|
|
|
|
1. Make sure that the id fields are mapped correctly
|
|
|
|
```prisma
|
|
id String @id @default(auto()) @map("_id") @db.ObjectId
|
|
```
|
|
|
|
2. The Native database type attribute to `@db.String` from `@db.Text`.
|
|
|
|
```prisma
|
|
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](https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database)) feature to change the field names. This won't affect NextAuth.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.
|
|
|
|
```json title="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 @unique
|
|
expires DateTime
|
|
|
|
@@unique([identifier, token])
|
|
@@map("verificationtokens")
|
|
}
|
|
```
|