データベースモデル
Auth.jsは任意のデータベースで使用できます。モデルは、Auth.jsがデータベースから期待する構造を示しています。モデルは使用するアダプターによって多少異なりますが、一般的には以下のグラフに似た構造になります。各モデルは、追加のフィールドで拡張できます。
Auth.jsはデータベース行にcamelCase
を使用しますが、OAuth関連の値には従来のsnake_case
フォーマットを尊重します。混合ケースが問題になる場合は、ほとんどのアダプターに、ケース表記規則を強制する方法に関する専用のドキュメントセクションがあります。
ユーザー
ユーザーモデルは、ユーザーの名前やメールアドレスなどの情報用です。メールアドレスはオプションですが、User
に指定されている場合は、一意である必要があります。
データベースでのユーザー作成は自動で行われ、ユーザーが初めて認証プロバイダー(OAuth、マジックリンク、またはプレーンな資格情報)でログインしたときに発生します。
OAuthサインイン
最初のサインインがOAuthプロバイダーによる場合、保存されるデフォルトのデータはid
、name
、email
、image
です。 OAuthプロバイダーのprofile()
コールバックで追加のフィールドを返すことで、より多くのプロファイルデータを追加できます。
マジックリンクサインイン
最初のサインインがメールプロバイダーによる場合、保存されるユーザーにはid
、email
、emailVerified
が含まれ、emailVerified
はユーザーが作成されたタイムスタンプになります。
アカウント
アカウントモデルは、User
に関連付けられたアカウントに関する情報用です。単一のUser
には複数のAccount
を持つことができますが、各Account
は1つのUser
しか持つことができません。
データベースでのアカウント作成は自動で行われ、ユーザーが初めて認証プロバイダー(OAuth、マジックリンク、またはプレーンな資格情報)でログインしたとき、またはAdapter.linkAccount
メソッドが呼び出されたときに発生します。
保存されるデフォルトのデータはaccess_token
、expires_at
、refresh_token
、id_token
、token_type
、scope
、session_state
です。OAuthプロバイダーのaccount()
コールバックで返すことで、他のフィールドを保存したり、不要なフィールドを削除したりできます。
Account
をUser
にリンクする処理は、メールアドレスが同じ場合、ユーザーが現在サインインしている場合にのみ自動的に行われます。この要件の理由については、FAQを参照してください。
アダプターがunlinkAccount
メソッドを実装している場合は、アカウントを手動でリンク解除できます。データ損失を避けるために、必要なセキュリティ対策をすべて行ってください。
セッション
データベースを使用している場合でも、高速アクセスのためセッション処理に**JWT**を使用できます。その場合、このモデルはデータベースでオプトアウトできます。
セッションモデルはデータベースセッションに使用され、アクティブなユーザーセッションの任意のデータを保存できます。単一のUser
には複数のSession
を持つことができますが、各Session
は1つのUser
しか持つことができません。
セッションが読み取られると、そのexpires
フィールドがチェックされ、セッションがまだ有効かどうかが確認されます。期限切れの場合は、セッションがデータベースから削除されます。アクティブなセッションの取得中にAuth.jsがデータベースに追加の削除呼び出しを行うのを避けるために、バックグラウンドで定期的にこのクリーンアップを実行することもできます。これにより、パフォーマンスがわずかに向上する可能性があります。
検証トークン
VerificationToken
モデルは、メールベースの**マジックリンク**サインインのトークンを保存するために使用されます。
単一のUser
は、複数の開いているVerificationToken
をアクティブにすることができます(例:異なるデバイスでのサインイン)。
ユーザーが忘れたり、サインインフロー中に失敗したりすると、データベースに不要な行が残ってしまう可能性があります。データベースに不要なデータが蓄積されるのを防ぐために、定期的にこれらのデータをクリーンアップすることをお勧めします。
将来、他の検証目的(例:2FA/マジックコードなど)に拡張できるように設計されています。
Auth.jsは、各トークンが一度だけ使用可能であり、デフォルトでは短い有効期間(1日、maxAge
で構成可能)を持つようにします。ユーザーが時間内にサインインフローを完了できなかった場合は、サインインプロセスをやり直す必要があります。