データベースアダプターの作成
Auth.js アダプターを使用すると、公式パッケージがまだ利用可能でない場合でも、任意の (複数の) データベース/バックエンドサービスと統合できます。(新しいアダプターの PR を歓迎します!下記のガイドラインを参照してください。)
Auth.js アダプターは非常に柔軟であり、必要なメソッドのみを実装し、実際に使用されるデータベーステーブル/列のみを作成できます。
Auth.js アダプターは、ORM/データベースクライアントを受け取り、データベースと対話するメソッド ( Adapter
インターフェースに基づく) を持つオブジェクトを返す関数です。同じデータベースアダプターは、すべての Auth.js ライブラリと互換性があります。
オプションで、Auth.js に準拠していることを確認するために、アダプターでアダプターテストを実行できます。
ユーザー管理
Auth.js はユーザーとアカウントを区別します。1 人のユーザーが複数のアカウントを持つことができます。アカウントは、ユーザーが初めてサインインするプロバイダーの種類ごとに作成されます。たとえば、ユーザーが Google でサインインし、次に Facebook でサインインした場合、各プロバイダーに 1 つずつ、2 つのアカウントを持つことになります。ユーザーがサインインする最初のプロバイダーは、ユーザーオブジェクトを作成するためにも使用されます。profile()
プロバイダーメソッドを参照してください。
メソッドとモデル
Auth.js によってまだ呼び出されていません
以下も参照してください:User モデルおよび Account モデル。
Auth.js では必須ではありませんが、基本的な表示目的のために、User
テーブルに name
、email
、image
の列も追加することをお勧めします。profile()
プロバイダーメソッドを介して列を設定できます。これらのプロパティを保存する必要がない場合は、空の profile() {}
メソッドを作成します。
Auth.js では必須ではありませんが、Account
テーブルには通常、プロバイダーから取得したトークンが保存されます。account()
プロバイダーメソッドを介して列を設定できます。トークンを保存する必要がない場合は、空の account() {}
メソッドを作成します。
データベースセッション管理
Auth.js は、2 つの方法でセッションを管理できます。それらと、その利点と欠点については、コンセプト: セッション戦略を参照してください。
メソッドとモデル
データベースセッションを使用する場合は、次のメソッドを実装する必要があります。
データベースセッション管理を追加するには、次のようにデータベーステーブル/列を拡張する必要があります。
以下も参照してください:Session モデル。
検証トークン
メール/パスワードレスログインをサポートする場合、Auth.js はデータベースを使用して、ユーザーのメールアドレスに関連付けられた一時的な検証トークンを保存します。
メソッドとモデル
以下も参照してください:検証トークンモデル。
公式アダプターのガイドライン
以下のすべての手順が完了したら、リポジトリに PR を送信する準備が整いました。
アダプターを作成し、公式パッケージとして配布したい場合は、次の要件を満たしていることを確認してください。パッケージの構造、必要なファイル、テストセットアップ、構成などについては、この既存のアダプターを確認してください。
-
アダプターは、
Adapter
インターフェースのすべてのメソッドを実装する必要があります。 -
アダプターテストを含める必要があり、合格する必要があります。Docker は、CI をネットワークエラーに対して回復力を持たせ、GitHub アクションシークレットの数を減らすために、サービスよりも推奨されます (フォーク PR でこれらのテストを実行することもできます)。
-
アダプターは、次のコーディングスタイルに従う必要があります。
- TypeScript で記述
- モノリポジトリのリンティングルールに合格
- ポリフィルを含めない
- ES モジュール (ESM) として構成
- JSDoc コメントを使用してドキュメント化
- メインモジュールからエクスポートされた少なくとも 1 つの名前付きエクスポートを持つ。(例:
export function MyAdapter(): Adapter {}
) - コレクション/テーブル名は、基盤となる ORM/データベースドキュメント/規則の規則 (複数形/単数形、camelCase/snake_case) に従う必要があります。
-
パッケージのメンテナンスを支援するために、モノリポジトリを構成します。
- (できれば
.svg
) ロゴをこのディレクトリに追加します。 - こことここで、アダプターを GitHub ワークフローファイルに追加します。
- 生成されたファイルがある場合は、必ず
.gitignore
してください。
- (できれば
-
アダプターは、ユーザーからのすべてのプロパティを処理できる必要があります。
ORM/データベースクライアントには独自のデータ型がある場合がありますが、Auth.js は一貫性のためにこれらがプレーンな JavaScript オブジェクトとして正規化されることを期待しています。ORM/データベースクライアントが自動的に変換しない場合は、データベースとの間で読み書きするときに値を変換する必要があります。
プロパティの名前をチェックしてそれに基づいて変換したくなるかもしれませんが、これはスケーラブルではありません (例:
User
オブジェクトには、emailVerified
だけでなく、複数のDate
プロパティが含まれている場合があります)。代わりに、値を変換するユーティリティ関数を作成することをお勧めします。以下は、日付を変換する方法の例です(ORM/データベースクライアントが他のデータ型を使用する場合は、日付だけでなく、それらも変換することを忘れないでください)。値が日付として解析できるかどうかを確認し、解析できる場合は、
Date
オブジェクトに変換します。それ以外の場合は、元の値をそのまま残します。
// https://github.com/honeinc/is-iso-date/blob/8831e79b5b5ee615920dcb350a355ffc5cbf7aed/index.js#L5
const isoDateRE =
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
const isDate = (val: any): val is ConstructorParameters<typeof Date>[0] =>
!!(val && isoDateRE.test(val) && !isNaN(Date.parse(val)))
export const format = {
/** Takes an object that's coming from a database and converts it to plain JavaScript. */
from<T>(object: Record<string, any> = {}): T {
const newObject: Record<string, unknown> = {}
for (const [key, value] of Object.entries(object))
if (isDate(value)) newObject[key] = new Date(value)
else newObject[key] = value
return newObject as T
},
/** Takes an object that's coming from Auth.js and prepares it to be written to the database. */
to<T>(object: Record<string, any>): T {
const newObject: Record<string, unknown> = {}
for (const [key, value] of Object.entries(object))
if (value instanceof Date) newObject[key] = value.toISOString()
else newObject[key] = value
return newObject as T
},
}
TypeScript
フレームワークパッケージ (つまり、next-auth/adapters
、@auth/sveltekit/adapters
) に付属する型を利用できます。
import type { Adapter } from "next-auth/adapters"
function MyAdapter(): Adapter {
return {
// your adapter methods here
}
}
JavaScript でアダプターを記述する場合でも、JSDoc を使用して、役立つエディターのヒントとオートコンプリートを取得できます。
/** @return { import("next-auth/adapters").Adapter } */
function MyAdapter() {
return {
// your adapter methods here
}
}