@auth/fauna-adapter
Official Fauna adapter for Auth.js / NextAuth.js.
Installation
npm install @auth/fauna-adapter fauna
FaunaAccount
type FaunaAccount: ToFauna<AdapterAccount>;
FaunaSession
type FaunaSession: ToFauna<AdapterSession>;
FaunaUser
type FaunaUser: ToFauna<AdapterUser>;
FaunaVerificationToken
type FaunaVerificationToken: ToFauna<VerificationToken> & {
id: string;
};
Type declaration
id
id: string;
format
const format: {
from: T;
to: T;
};
Type declaration
from()
Takes an object that’s coming from the database and converts it to plain JavaScript.
Type parameters
Type parameter |
---|
T |
Parameters
Parameter | Type |
---|---|
object | Record <string , any > |
Returns
T
to()
Takes an object that’s coming from Auth.js and prepares it to be written to the database.
Type parameters
Type parameter |
---|
T |
Parameters
Parameter | Type |
---|---|
object | Record <string , any > |
Returns
T
FaunaAdapter()
FaunaAdapter(client, config?): Adapter
Setup
This is the Fauna Adapter for Auth.js. This package can only be used in conjunction with the primary next-auth
and other framework packages. It is not a standalone package.
You can find the Fauna schema and seed information in the docs at authjs.dev/reference/adapter/fauna.
Configure Auth.js
import NextAuth from "next-auth"
import { Client } from "fauna"
import { FaunaAdapter } from "@auth/fauna-adapter"
const client = new Client({
secret: "secret",
endpoint: new URL('http://localhost:8443')
})
// For more information on each option (and a full list of options) go to
// https://authjs.dev/reference/core/types#authconfig
export default NextAuth({
// https://authjs.dev/getting-started/authentication/oauth
providers: [],
adapter: FaunaAdapter(client)
})
Schema
Run the following FQL code inside the Shell
tab in the Fauna dashboard to set up the appropriate collections and indexes.
Collection.create({
name: "Account",
indexes: {
byUserId: {
terms: [
{ field: "userId" }
]
},
byProviderAndProviderAccountId: {
terms [
{ field: "provider" },
{ field: "providerAccountId" }
]
},
}
})
Collection.create({
name: "Session",
constraints: [
{
unique: ["sessionToken"],
status: "active",
}
],
indexes: {
bySessionToken: {
terms: [
{ field: "sessionToken" }
]
},
byUserId: {
terms [
{ field: "userId" }
]
},
}
})
Collection.create({
name: "User",
constraints: [
{
unique: ["email"],
status: "active",
}
],
indexes: {
byEmail: {
terms [
{ field: "email" }
]
},
}
})
Collection.create({
name: "VerificationToken",
indexes: {
byIdentifierAndToken: {
terms [
{ field: "identifier" },
{ field: "token" }
]
},
}
})
This schema is adapted for use in Fauna and based upon our main schema
Custom collection names
If you want to use custom collection names, you can pass them as an option to the adapter, like this:
FaunaAdapter(client, {
collectionNames: {
user: "CustomUser",
account: "CustomAccount",
session: "CustomSession",
verificationToken: "CustomVerificationToken",
}
})
Make sure the collection names you pass to the provider match the collection names of your Fauna database.
Migrating from v1
In v2, we’ve renamed the collections to use uppercase naming, in accordance with Fauna best practices. If you’re migrating from v1, you’ll need to rename your collections to match the new naming scheme. Additionally, we’ve renamed the indexes to match the new method-like index names.
Migration script
Run this FQL script inside a Fauna shell for the database you’re migrating from v1 to v2 (it will rename your collections and indexes to match):
Collection.byName("accounts")!.update({
name: "Account"
indexes: {
byUserId: {
terms: [{ field: "userId" }]
},
byProviderAndProviderAccountId: {
terms: [{ field: "provider" }, { field: "providerAccountId" }]
},
account_by_provider_and_provider_account_id: null,
accounts_by_user_id: null
}
})
Collection.byName("sessions")!.update({
name: "Session",
indexes: {
bySessionToken: {
terms: [{ field: "sessionToken" }]
},
byUserId: {
terms: [{ field: "userId" }]
},
session_by_session_token: null,
sessions_by_user_id: null
}
})
Collection.byName("users")!.update({
name: "User",
indexes: {
byEmail: {
terms: [{ field: "email" }]
},
user_by_email: null
}
})
Collection.byName("verification_tokens")!.update({
name: "VerificationToken",
indexes: {
byIdentifierAndToken: {
terms: [{ field: "identifier" }, { field: "token" }]
},
verification_token_by_identifier_and_token: null
}
})
Parameters
Parameter | Type |
---|---|
client | Client |
config ? | AdapterConfig |