アダプター
Auth.jsは、任意のデータレイヤー(データベース、ORM、バックエンドAPI、HTTPクライアント)と統合して、ユーザーの自動作成、アカウントリンクの自動処理、パスワードレスログインのサポート、セッション情報の保存を自動化できます。
このモジュールには、Auth.js互換のアダプターを作成するためのユーティリティ関数と型が含まれています。
Auth.jsは、ユーザーのログイン状態を保持するために2つのセッション戦略をサポートしています。デフォルトでは、CookieとJWTベースのセッションストアを使用しますが(strategy: "jwt"
)、データベースアダプターを使用してセッションをデータベースに保存することもできます。
先に進む前に、Auth.jsには公式データベースアダプターの一覧があります。お使いのデータベースがそこに記載されている場合は、独自のアダプターを作成する必要はない可能性があります。公式アダプターと統合できないデータソリューションを使用している場合、このモジュールは互換性のあるアダプターの作成に役立ちます。
注記 @auth/core
はフレームワーク/ランタイムに依存しませんが、アダプターは、フレームワーク/ランタイムとまだ互換性のないクライアント/ORMパッケージに依存する場合があります(たとえば、Node.js APIに依存する場合があります)。関連する問題は、対応するパッケージのメンテナーに報告する必要があります。
インストール
npm install @auth/core
その後、@auth/core/adapters
からこのサブモジュールをインポートできます。
使用方法
各アダプターメソッドとその関数シグネチャは、アダプターインターフェースに記載されています。
import { type Adapter } from "@auth/core/adapters"
// 1. Simplest form, a plain object.
export const MyAdapter: Adapter {
// implement the adapter methods here
}
// or
// 2. A function that returns an object. Official adapters use this pattern.
export function MyAdapter(config: any): Adapter {
// Instantiate a client/ORM here with the provided config, or pass it in as a parameter.
// Usually, you might already have a client instance elsewhere in your application,
// so you should only create a new instance if you need to or you don't have one.
return {
// implement the adapter methods
}
}
その後、adapter
オプションとしてアダプターをAuth.jsに渡すことができます。
import { MyAdapter } from "./my-adapter"
const response = await Auth(..., {
adapter: MyAdapter, // 1.
// or
adapter: MyAdapter({ /* config */ }), // 2.
...
})
ゼロから作成するのではなく、既存のアダプターを調整してデータレイヤーで動作させることができる場合があります。
import { type Adapter } from "@auth/core/adapters"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { PrismaClient } from "@prisma/client"
const prisma = new PrismaClient()
const adapter: Adapter = {
...PrismaAdapter(prisma),
// Add your custom methods here
}
const request = new Request("https://example.com")
const response = await Auth(request, { adapter, ... })
モデル
Auth.jsは任意のデータベースで使用できます。モデルは、Auth.jsがデータベースから期待する構造を示しています。モデルは使用するアダプターによってわずかに異なりますが、一般的には以下のグラフと同様の構造になります。各モデルは、追加のフィールドで拡張できます。
Auth.js / NextAuth.jsはデータベース行にcamelCase
を使用しますが、OAuth関連の値には従来のsnake_case
形式を尊重します。混合ケースが問題になる場合は、ほとんどのアダプターに、ケース表記規則を強制する方法に関する専用のドキュメントセクションがあります。
テスト
アダプターがAuth.jsと互換性があることを確認するためのテストスイートが利用可能です。
既知の問題
以下は、Auth.jsには組み込まれていない機能ですが、ユーザー側で解決できるものです。これらの機能の実装にご協力いただける場合は、ご連絡ください。
トークンのローテーション
Auth.jsは現在、access_token
のローテーションをすぐにサポートしていません。refresh_token
、有効期限など必要な情報はデータベースに保存されていますが、トークンをローテーションするロジックはコアライブラリには実装されていません。このガイドは、ユーザー側でこれを行うための必要な手順を提供するはずです。
フェデレーテッドログアウト
Auth.jsは現在、すぐにフェデレーテッドログアウトをサポートしていません。これは、アクティブなセッションがデータベースから削除されても、ユーザーはアイデンティティプロバイダーに引き続きログインしたままになり、アプリケーションからログアウトされるだけであることを意味します。たとえば、Googleをアイデンティティプロバイダーとして使用し、データベースからセッションを削除した場合、ユーザーはGoogleに引き続きログインしたままですが、アプリケーションからはログアウトされます。
ユーザーが共有のコンピューター(例:図書館)からアプリケーションを使用している可能性がある場合は、フェデレーテッドログアウトを実装することを検討する必要があります。
アダプター
アダプターは、データソースからデータを読み書きする関数プロパティ(メソッド)を持つオブジェクトです。これらのメソッドは、データレイヤーをAuth.jsが理解できる共通インターフェースに正規化する方法と考えてください。
これがAuth.jsを非常に柔軟にし、任意のデータレイヤーで使用できる理由です。
アダプターメソッドは、次の操作を実行するために使用されます。
- ユーザーの作成/更新/削除
- ユーザーへの/からのアカウントのリンク/リンク解除
- アクティブなセッションの処理
- 複数のデバイス間でのパスワードレス認証のサポート
メソッドが実装されていないがAuth.jsによって呼び出された場合、ユーザーにエラーが表示され、操作は失敗します。
メソッド
createAuthenticator()?
optional createAuthenticator(authenticator): Awaitable<AdapterAuthenticator>
新しい認証子を作成します。
作成に失敗した場合、アダプタはエラーをスローする必要があります。
パラメータ
パラメータ | 型 |
---|---|
authenticator | AdapterAuthenticator |
戻り値
Awaitable
<AdapterAuthenticator
>
createSession()?
optional createSession(session): Awaitable<AdapterSession>
ユーザーのセッションを作成して返します。
参照: データベースセッション管理
パラメータ
パラメータ | 型 |
---|---|
session | オブジェクト |
session.expires | 日付 |
session.sessionToken | 文字列 |
session.userId | 文字列 |
戻り値
createUser()?
optional createUser(user): Awaitable<AdapterUser>
データベースにユーザーを作成して返します。
参照: ユーザー管理
パラメータ
パラメータ | 型 |
---|---|
user | AdapterUser |
戻り値
createVerificationToken()?
optional createVerificationToken(verificationToken): Awaitable<undefined | null | VerificationToken>
検証トークンを作成して返します。
参照: 検証トークン
パラメータ
パラメータ | 型 |
---|---|
verificationToken | VerificationToken |
戻り値
Awaitable
<undefined
| null
| VerificationToken
>
deleteSession()?
optional deleteSession(sessionToken): Promise<void> | Awaitable<undefined | null | AdapterSession>
データベースからセッションを削除します。ログ出力のため、このメソッドは削除されるセッションを返すことも推奨されます。
参照: データベースセッション管理
パラメータ
パラメータ | 型 |
---|---|
sessionToken | 文字列 |
戻り値
Promise
<void
> | Awaitable
<undefined
| null
| AdapterSession
>
deleteUser()?
optional deleteUser(userId): Promise<void> | Awaitable<undefined | null | AdapterUser>
パラメータ
パラメータ | 型 |
---|---|
userId | 文字列 |
戻り値
Promise
<void
> | Awaitable
<undefined
| null
| AdapterUser
>
TODO
このメソッドはまだ呼び出されていません。
参照: ユーザー管理
getAccount()?
optional getAccount(providerAccountId, provider): Awaitable<null | AdapterAccount>
プロバイダアカウントIDとプロバイダからアカウントを取得します。
アカウントが見つからない場合、アダプタはnull
を返す必要があります。
パラメータ
パラメータ | 型 |
---|---|
providerAccountId | 文字列 |
プロバイダー | 文字列 |
戻り値
Awaitable
<null
| AdapterAccount
>
getAuthenticator()?
optional getAuthenticator(credentialID): Awaitable<null | AdapterAuthenticator>
credentialIDから認証子を取得します。
認証子が見つからない場合、アダプタはnull
を返す必要があります。
パラメータ
パラメータ | 型 |
---|---|
credentialID | 文字列 |
戻り値
Awaitable
<null
| AdapterAuthenticator
>
getSessionAndUser()?
optional getSessionAndUser(sessionToken): Awaitable<null | {
session: AdapterSession;
user: AdapterUser;
}>
データベースからセッションとユーザーを一度に取得します。
データベースが結合をサポートしている場合は、データベースクエリの数を減らすことをお勧めします。
参照: データベースセッション管理
パラメータ
パラメータ | 型 |
---|---|
sessionToken | 文字列 |
戻り値
Awaitable
<null
| { session
: AdapterSession
; user
: AdapterUser
; }>
getUser()?
optional getUser(id): Awaitable<null | AdapterUser>
ユーザーIDを介してデータベースからユーザーを取得します。
参照: ユーザー管理
パラメータ
パラメータ | 型 |
---|---|
id | 文字列 |
戻り値
Awaitable
<null
| AdapterUser
>
getUserByAccount()?
optional getUserByAccount(providerAccountId): Awaitable<null | AdapterUser>
プロバイダIDと特定のアカウントのユーザーIDを使用して、ユーザーを取得します。
参照: ユーザー管理
パラメータ
パラメータ | 型 |
---|---|
providerAccountId | Pick <AdapterAccount , "provider" | "providerAccountId" > |
戻り値
Awaitable
<null
| AdapterUser
>
getUserByEmail()?
optional getUserByEmail(email): Awaitable<null | AdapterUser>
ユーザーのメールアドレスを介してデータベースからユーザーを取得します。
参照: 検証トークン
パラメータ
パラメータ | 型 |
---|---|
メール | 文字列 |
戻り値
Awaitable
<null
| AdapterUser
>
linkAccount()?
optional linkAccount(account): Promise<void> | Awaitable<undefined | null | AdapterAccount>
このメソッドは内部的に呼び出されます(ただし、手動リンクにも使用できます)。データベースにAccountを作成します。
参照: ユーザー管理
パラメータ
パラメータ | 型 |
---|---|
account | AdapterAccount |
戻り値
Promise
<void
> | Awaitable
<undefined
| null
| AdapterAccount
>
listAuthenticatorsByUserId()?
optional listAuthenticatorsByUserId(userId): Awaitable<AdapterAuthenticator[]>
ユーザーのすべての認証子を返します。
ユーザーが見つからない場合でも、アダプタは空の配列を返す必要があります。その他の理由で取得に失敗した場合、アダプタはエラーをスローする必要があります。
パラメータ
パラメータ | 型 |
---|---|
userId | 文字列 |
戻り値
Awaitable
<AdapterAuthenticator
[]>
unlinkAccount()?
optional unlinkAccount(providerAccountId): Promise<void> | Awaitable<undefined | AdapterAccount>
パラメータ
パラメータ | 型 |
---|---|
providerAccountId | Pick <AdapterAccount , "provider" | "providerAccountId" > |
戻り値
Promise
<void
> | Awaitable
<undefined
| AdapterAccount
>
TODO
このメソッドはまだ呼び出されていません。
updateAuthenticatorCounter()?
optional updateAuthenticatorCounter(credentialID, newCounter): Awaitable<AdapterAuthenticator>
認証子のカウンターを更新します。
更新に失敗した場合、アダプタはエラーをスローする必要があります。
パラメータ
パラメータ | 型 |
---|---|
credentialID | 文字列 |
newCounter | 数値 |
戻り値
Awaitable
<AdapterAuthenticator
>
updateSession()?
optional updateSession(session): Awaitable<undefined | null | AdapterSession>
データベース内のセッションを更新して返します。
参照: データベースセッション管理
パラメータ
パラメータ | 型 |
---|---|
session | Partial <AdapterSession > & Pick <AdapterSession , "sessionToken" > |
戻り値
Awaitable
<undefined
| null
| AdapterSession
>
updateUser()?
optional updateUser(user): Awaitable<AdapterUser>
データベース内のユーザー情報を更新し、更新後のユーザー情報を返します。
参照: ユーザー管理
パラメーター
パラメータ | 型 |
---|---|
user | Partial <AdapterUser > & Pick <AdapterUser , "id" > |
戻り値
useVerificationToken()?
optional useVerificationToken(params): Awaitable<null | VerificationToken>
データベースから検証トークンを取得し、削除します。そのため、トークンは一度しか使用できません。
参照: 検証トークン
パラメーター
パラメータ | 型 |
---|---|
params | オブジェクト |
params.identifier | 文字列 |
params.token | 文字列 |
戻り値
Awaitable
<null
| VerificationToken
>
AdapterAccount
アカウントは、ユーザーとプロバイダー間の接続を表します。
アカウントには2つの種類があります。
- OAuth/OIDCアカウント:ユーザーがOAuthプロバイダーを使用してサインインしたときに作成されます。
- メールアカウント:ユーザーがメールプロバイダーを使用してサインインしたときに作成されます。
1人のユーザーは複数のアカウントを持つことができます。
継承元
プロパティ
access_token?
optional readonly access_token: string;
継承元
authorization_details?
optional readonly authorization_details: AuthorizationDetails[];
継承元
expires_at?
optional expires_at: number;
TokenEndpointResponse.expires_inに基づいて計算された値です。
TokenEndpointResponse.access_tokenが期限切れになる絶対的なタイムスタンプ(秒単位)です。
この値は、TokenEndpointResponse.refresh_tokenと共にトークンのローテーションを実装するために使用できます。
参照
- https://authjs.dokyumento.jp/guides/refresh-token-rotation#database-strategy
- https://www.rfc-editor.org/rfc/rfc6749#section-5.1
継承元
expires_in?
optional readonly expires_in: number;
継承元
id_token?
optional readonly id_token: string;
継承元
provider
provider: string;
このアカウントのプロバイダーIDです。例:「google」。完全なリストはhttps://authjs.dokyumento.jp/reference/core/providersを参照してください。
継承元
providerAccountId
providerAccountId: string;
この値は、アカウントの作成に使用されているプロバイダーの種類によって異なります。
- oauth/oidc:
profile()
コールバックから返されるOAuthアカウントのIDです。 - email: ユーザーのメールアドレスです。
- credentials:
authorize()
コールバックから返されるid
です。
継承元
refresh_token?
optional readonly refresh_token: string;
継承元
scope?
optional readonly scope: string;
継承元
token_type?
optional readonly token_type: Lowercase<string>;
注記:値は大文字と小文字を区別しないため、常に小文字で返されます。
継承元
type
type: AdapterAccountType;
このアカウントのプロバイダーの種類です。
オーバーライド
userId
userId: string;
このアカウントが属するユーザーのIDです。
参照
https://authjs.dokyumento.jp/reference/core/adapters#adapteruser
オーバーライド
AdapterAuthenticator
オーセンティケーターは、ユーザーに割り当てられた資格情報オーセンティケーターを表します。
継承元
プロパティ
counter
counter: number;
オーセンティケーターが使用された回数です。
継承元
credentialBackedUp
credentialBackedUp: boolean;
クライアントオーセンティケーターが資格情報をバックアップしたかどうかを示します。
継承元
Authenticator
.credentialBackedUp
credentialDeviceType
credentialDeviceType: string;
オーセンティケーターのデバイスの種類です。
継承元
Authenticator
.credentialDeviceType
credentialID
credentialID: string;
Base64でエンコードされた資格情報IDです。
継承元
credentialPublicKey
credentialPublicKey: string;
Base64でエンコードされた資格情報の公開鍵です。
継承元
Authenticator
.credentialPublicKey
providerAccountId
providerAccountId: string;
認証子に接続されているプロバイダーアカウントID。
継承元
Authenticator
.providerAccountId
transports?
optional transports: null | string;
連結されたトランスポートフラグ。
継承元
userId
userId: string;
認証子のユーザーID。
オーバーライド
AdapterSession
セッションは、ユーザーの現在のサインイン状態に関する情報を保持します。
プロパティ
expires
expires: Date;
セッションが期限切れになる絶対日付。
SessionOptions.maxAge
で定義されているmaxAge
オプションに基づいて、セッションが期限切れになる前にアクセスされた場合、延長されます。 SessionOptions.updateAge
で定義された期間内では、一度しか延長されません。
セッションが期限切れになった後にアクセスされた場合、非アクティブなセッションをクリーンアップするためにデータベースから削除されます。
sessionToken
sessionToken: string;
"database"
AuthConfig.strategy
オプションを使用する場合、データベース内のセッションを検索するために使用される、ランダムに生成された値です。この値は、クライアント側の安全なHTTP専用Cookieに保存されます。
userId
userId: string;
アクティブなセッションをデータベース内のユーザーに接続します。
AdapterUser
ユーザーは、アプリケーションにサインインできる人を表します。ユーザーがまだ存在しない場合、初めてサインインしたときに、IDプロバイダーから返された情報(プロフィールデータ)を使用して作成されます。対応するアカウントも作成され、ユーザーにリンクされます。
拡張
プロパティ
email: string;
ユーザーのメールアドレス。
オーバーライド
emailVerified
emailVerified: null | Date;
ユーザーがメールプロバイダーを介してメールアドレスを検証したかどうか。ユーザーがまだメールプロバイダーでサインインしていない場合、または最初のサインインに成功した日付の場合はnull
です。
id
id: string;
ユーザーの一意の識別子。
オーバーライド
image?
optional image: null | string;
継承元
name?
optional name: null | string;
継承元
VerificationToken
検証トークンは、ユーザーのメールアドレスを介してユーザーをサインインするために使用される一時的なトークンです。ユーザーがメールプロバイダーでサインインするときに作成されます。ユーザーがメール内のリンクをクリックすると、トークンとメールがサーバーに送信され、ハッシュ化されてデータベース内の値と比較されます。トークンとメールが一致し、トークンがまだ期限切れになっていない場合、ユーザーはサインインされます。その後、トークンはデータベースから削除されます。
プロパティ
expires
expires: Date;
トークンが期限切れになる絶対日付。
identifier
identifier: string;
ユーザーのメールアドレス。
token
token: string;
AuthConfig.secret
値を使用してハッシュ化されたトークン。
AdapterAccountType
type AdapterAccountType: Extract<ProviderType, "oauth" | "oidc" | "email" | "webauthn">;
アカウントの種類。
isDate()
isDate(value): value is string
指定された値をDate
に解析できるかどうかを判別します。
パラメーター
パラメータ | 型 |
---|---|
value | unknown |
戻り値
value が文字列の場合