メインコンテンツまでスキップ
バージョン: 0.4.2

⚙️ 認証ハンドラーブロック

認証ハンドラーブロックは、Nodeblocksアプリケーションにおけるユーザー認証と認可操作のためのコアビジネスロジック関数を提供します。これらのハンドラーは、ログイン、登録、トークン管理、メール確認の共通パターンをカプセル化します。


🎯 概要

認証ハンドラーブロックは以下を目的として設計されています:

  • 認証情報とトークンによるユーザー認証の処理
  • 検証とセキュリティによるユーザー登録の管理
  • 作成、更新、検証を含むトークン操作の処理
  • メール確認ワークフローのサポート
  • 適切なトークン検証とフィンガープリンティングによるセキュリティの確保

📋 認証ハンドラー種類

認証非同期ハンドラー

非同期認証操作(データベース呼び出し、トークン生成など)を実行する関数。

認証同期ハンドラー

同期認証操作(トークン検証、レスポンスフォーマッティングなど)を実行する関数。

認証ターミネーターハンドラー

最終的な認証レスポンスをフォーマットして返す関数。


🔧 利用可能な認証ハンドラー

loginWithCredentials

メールとパスワード認証情報でユーザーを認証します。

目的: 認証情報の検証とアカウントセキュリティによるユーザーログインを処理

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.email または context.data.email: ユーザーメール
    • params.requestBody.password または context.data.password: ユーザーパスワード
    • context.db: データベース接続
    • context.configuration.maxFailedLoginAttempts: 最大失敗試行回数(デフォルト: 5)

戻り値: Result<RouteHandlerPayload, Error> - identityを含む成功またはエラー

ペイロード要件:

  • メールとパスワードはリクエストボディまたはコンテキストデータで提供される必要があります
  • データベース操作のためにcontext.dbが利用可能である必要があります
  • context.configurationにmaxFailedLoginAttempts設定が含まれている必要があります

主要機能:

  • メールとパスワードが提供されていることを検証
  • データベースでユーザーアイデンティティの存在を確認
  • 認証のためにパスワードハッシュを比較
  • 失敗試行後のアカウントロックを処理
  • 成功したログイン時の失敗試行のリセット
  • 成功時にアイデンティティデータを返す
  • データベースエラーを適切に処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { loginWithCredentials } = handlers;

// コンポジションでの使用
const authPipeline = compose(loginWithCredentials, createAccessToken, createRefreshToken, setResponseCookie, loginTerminator);

createAccessToken

認証済みセッション用のユーザーアクセストークンを生成します。

目的: フィンガープリント検証付きの安全なアクセストークンを作成

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.fingerprint または context.data.fingerprint: セキュリティフィンガープリント
    • params.requestBody.id または context.data.id または context.identity.id: ユーザーID
    • context.request: Expressリクエストオブジェクト
    • context.configuration.authSecrets: 認証シークレット
    • context.configuration.jwtOpts: JWTオプション

戻り値: Result<RouteHandlerPayload, Error> - accessTokenを含む成功またはエラー

ペイロード要件:

  • ユーザーIDはリクエストボディ、コンテキストデータ、またはアイデンティティから利用可能である必要があります
  • トークン検証のためにcontext.requestにIPとヘッダーが含まれている必要があります
  • context.configuration.authSecretsjwtOptsが利用可能である必要があります

主要機能:

  • 複数のソース(リクエストボディ、コンテキストデータ、アイデンティティ)からユーザーIDを抽出
  • ドメイン、フィンガープリント、IP、ユーザーエージェントでトークン検証を構築
  • JWTで安全なユーザーアクセストークンを生成
  • 成功時にアクセストークンを返す
  • トークン生成エラーを適切に処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { createAccessToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(loginWithCredentials, createAccessToken, createRefreshToken, setResponseCookie, loginTerminator);

createRefreshToken

トークン更新用のリフレッシュトークンを生成します。

目的: データベース保存付きの安全なリフレッシュトークンを作成

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.fingerprint または context.data.fingerprint: セキュリティフィンガープリント
    • params.requestBody.id または context.data.id または context.identity.id: ユーザーID
    • context.request: Expressリクエストオブジェクト
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット
    • context.configuration.refreshTokenOpts: リフレッシュトークンオプション
    • context.configuration.refreshTokenExpireTime: リフレッシュトークン期限

戻り値: Result<RouteHandlerPayload, Error> - refreshTokenを含む成功またはエラー

ペイロード要件:

  • ユーザーIDはリクエストボディ、コンテキストデータ、またはアイデンティティから利用可能である必要があります
  • トークン検証のためにcontext.requestにIPとヘッダーが含まれている必要があります
  • トークン保存のためにcontext.dbが利用可能である必要があります
  • context.configurationに認証シークレットとリフレッシュトークンオプションが含まれている必要があります

主要機能:

  • 複数のソースからユーザーIDとフィンガープリントを抽出
  • ドメイン、フィンガープリント、IP、ユーザーエージェントでトークン検証を構築
  • JWTで安全なリフレッシュトークンを生成
  • 期限付きでデータベースにトークンを保存
  • 成功時にリフレッシュトークンを返す
  • トークン生成と保存エラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { createRefreshToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(loginWithCredentials, createAccessToken, createRefreshToken, setResponseCookie, loginTerminator);

setResponseCookie

HTTPレスポンスで認証クッキーを設定します。

目的: アクセストークンとリフレッシュトークン用の安全なクッキーを構成

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • context.response: Expressレスポンスオブジェクト
    • context.cookieOpts: クッキー設定オプション
    • context.data.accessToken: クッキーに設定するアクセストークン
    • context.data.refreshToken: クッキーに設定するリフレッシュトークン

戻り値: Result<RouteHandlerPayload, Error> - 更新されたペイロードを含む成功またはエラー

ペイロード要件:

  • クッキー設定のためにcontext.responseが利用可能である必要があります
  • context.cookieOptsにクッキー設定が含まれている必要があります
  • アクセストークンおよび/またはリフレッシュトークンがコンテキストデータで利用可能である必要があります

主要機能:

  • レスポンスオブジェクトが利用可能であることを検証
  • Access-Control-Allow-Credentialsヘッダーを設定
  • アクセストークン用の安全なクッキーを構成
  • リフレッシュトークン用の安全なクッキーを構成
  • 提供されたクッキーオプションを使用してセキュリティを確保
  • 成功時に更新されたペイロードを返す

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { setResponseCookie } = handlers;

// コンポジションでの使用
const authPipeline = compose(loginWithCredentials, createAccessToken, createRefreshToken, setResponseCookie, loginTerminator);

registerCredentials

メールとパスワードで新しいユーザーアカウントを登録します。

目的: パスワードハッシュ化とアカウント作成による新規ユーザー登録を処理

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.email または context.data.email: ユーザーメール
    • params.requestBody.password または context.data.password: ユーザーパスワード
    • context.db: データベース接続

戻り値: Result<RouteHandlerPayload, Error> - identityを含む成功またはエラー

主要機能:

  • メールとパスワードの存在を検証
  • 既存のメールアドレスの重複をチェック
  • 安全なパスワードハッシュを生成
  • データベースに新しいアイデンティティを作成
  • 成功時にアイデンティティデータを返す
  • 重複メールとデータベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { registerCredentials } = handlers;

// コンポジションでの使用
const registerPipeline = compose(registerCredentials, createAccessToken, createRefreshToken, registerTerminator);

sendVerificationEmail

ユーザーメール確認のための確認メールを送信します。

目的: メール確認トークンとメール送信による確認プロセスを処理

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestParams.userId または context.data.userId: ユーザーID
    • context.db: データベース接続
    • context.configuration.emailService: メールサービス設定

戻り値: Result<RouteHandlerPayload, Error> - 成功またはエラー

主要機能:

  • ユーザーIDの存在を検証
  • データベースでユーザーアイデンティティを検索
  • 確認トークンを生成
  • データベースに確認トークンを保存
  • 確認リンク付きメールを送信
  • メール送信とデータベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { sendVerificationEmail } = handlers;

// コンポジションでの使用
const verificationPipeline = compose(sendVerificationEmail, emailSentTerminator);

refreshToken

有効なリフレッシュトークンを使用してアクセストークンを更新します。

目的: トークンのローテーションと新規アクセストークン/リフレッシュトークンペアの生成

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.fingerprint または context.data.fingerprint または context.fingerprint: セキュリティフィンガープリント
    • context.request: クッキーとボディを含むExpressリクエストオブジェクト
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット
    • context.configuration.jwtOpts: JWTオプション

戻り値: Result<RouteHandlerPayload, Error> - 新しいトークンを含む成功またはエラー

ペイロード要件:

  • クッキーまたはボディにリフレッシュトークンが含まれている必要があります
  • トークン無効化のためにcontext.dbが利用可能である必要があります
  • context.configurationに認証シークレットとJWTオプションが含まれている必要があります

主要機能:

  • 複数のソースからフィンガープリントを抽出
  • クッキーとボディからのリフレッシュトークンを検証
  • 整合性のためにクッキーとボディトークンを比較
  • データベースで古いリフレッシュトークンを無効化
  • 新しいアクセスとリフレッシュトークンを生成
  • 成功時に新しいトークンペアを返す
  • トークン検証と生成エラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { refreshToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(refreshToken, setResponseCookie, loginTerminator);

confirmEmail

確認トークンでユーザーメールアドレスを確認します。

目的: トークン検証とアカウント有効化によるメール確認を処理

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.token または context.data.token: 確認トークン
    • context.db: データベース接続

戻り値: Result<RouteHandlerPayload, Error> - 成功またはエラー

主要機能:

  • 確認トークンの存在を検証
  • データベースで有効なトークンを検索
  • トークンの期限を確認
  • ユーザーアイデンティティを確認済みとしてマーク
  • 使用済みトークンを削除
  • 無効または期限切れトークンを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { confirmEmail } = handlers;

// コンポジションでの使用
const confirmationPipeline = compose(confirmEmail, emailConfirmedTerminator);

logout

ユーザーセッションを終了し、リフレッシュトークンを無効化します。

目的: トークン無効化とセッションクリーンアップによるログアウトを処理

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.refreshToken または context.data.refreshToken: リフレッシュトークン
    • context.db: データベース接続

戻り値: Result<RouteHandlerPayload, Error> - 成功またはエラー

主要機能:

  • リフレッシュトークンの存在を検証
  • データベースからトークンを削除
  • セッションデータをクリーンアップ
  • 成功したログアウトを確認
  • データベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { logout } = handlers;

// コンポジションでの使用
const logoutPipeline = compose(logout, logoutTerminator);

checkToken

認証トークンを検証し、ユーザー情報を抽出します。

目的: トークンの真正性を検証し、ユーザー情報を抽出

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.token: 検証するトークン
    • context.data.checkToken.target: トークンターゲット(オプション)
    • context.request: Expressリクエストオブジェクト
    • context.db: 一回限りトークン用のデータベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - トークン情報またはエラーを含む成功

ペイロード要件:

  • リクエストボディにトークンが含まれている必要があります
  • リクエスト情報抽出のためにcontext.requestが利用可能である必要があります
  • 一回限りトークン検証のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • リクエストからトークンとフィンガープリントを抽出
  • JWT検証を使用してトークンを検証
  • ユーザーアクセストークンと一回限りトークンを処理
  • アクセストークンに対してセキュリティチェックを実行
  • 一回限りトークンのターゲットと状態を検証
  • 使用後に一回限りトークンを無効化
  • 成功時にトークン情報またはユーザーIDを返す
  • トークン検証エラーを適切に処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { checkToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(checkToken, someOtherHandler);

deleteToken

ユーザーセッションを無効化します。

目的: セキュリティ検証によるトークンの削除

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • context.data.id または params.requestBody.id または params.requestQuery.id: トークンを削除するユーザーID
    • context.request: クッキーとヘッダーを含むExpressリクエストオブジェクト
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - 更新されたペイロードを含む成功またはエラー

ペイロード要件:

  • リクエストボディ、コンテキストデータ、またはクエリパラメータにユーザーIDが含まれている必要があります
  • トークン抽出のためにcontext.requestが利用可能である必要があります
  • トークン無効化のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • 複数のソースからユーザーIDを抽出
  • クッキーとBearerヘッダーからトークンを検証
  • 整合性のためにクッキーとBearerトークンを比較
  • アプリアクセストークンのスーパーパーミッションを処理
  • ユーザーが自分のトークンのみを削除できることを検証
  • 削除タイムスタンプ付きでデータベースのトークンを無効化
  • 成功時に更新されたペイロードを返す
  • トークン検証と削除エラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { deleteToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(deleteToken, someTerminator);

loginWithOnetimeToken

一回限りトークンを使用してユーザーを認証します。

目的: 一時的な一回限りトークンによる認証

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.onetimeToken: 認証用の一回限りトークン
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - 更新されたペイロードを含む成功またはエラー

ペイロード要件:

  • リクエストボディに一回限りトークンが含まれている必要があります
  • トークン検証のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • リクエストボディから一回限りトークンを検証
  • JWTを使用してトークンを復号化して検証
  • トークンタイプが'onetime'であることを検証
  • データベースでトークンが見つかり、有効であることを確認
  • 成功した使用後にトークンを無効化
  • トークン目的が'onetime-login'であることを検証
  • 成功時に更新されたペイロードを返す
  • トークン検証とデータベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { loginWithOnetimeToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(loginWithOnetimeToken, createAccessToken, createRefreshToken, setResponseCookie, loginTerminator);

generateOnetimeToken

一時アクセス用のトークンを生成します。

目的: データベース保存付きの安全な一回限りトークンの作成

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.fingerprint または context.data.fingerprint または context.fingerprint: セキュリティフィンガープリント
    • params.requestBody.target または context.data.target または context.target: トークンターゲット
    • params.requestBody.tokenData または context.data.tokenData または context.tokenData: トークンデータオブジェクト
    • context.request: Expressリクエストオブジェクト
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - 生成されたトークンを含む成功またはエラー

ペイロード要件:

  • オブジェクトとしてのトークンデータが提供される必要があります
  • リクエスト情報のためにcontext.requestが利用可能である必要があります
  • トークン保存のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • トークンデータがオブジェクトとして提供されていることを検証
  • 複数のソースからフィンガープリント、ターゲット、トークンデータを抽出
  • ドメイン、フィンガープリント、IP、ターゲットでトークン検証を構築
  • JWTで安全な一回限りトークンを生成
  • 無効化フラグ付きでデータベースにトークンを保存
  • 成功時に生成されたトークンを返す
  • トークン生成と保存エラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { generateOnetimeToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(generateOnetimeToken, someTerminator);

restoreOnetimeToken

以前に無効化された一回限りトークンを復元します。

目的: 一回限りトークンを再利用可能にする

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.token: 復元するトークン
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - 復元されたトークンを含む成功またはエラー

ペイロード要件:

  • リクエストボディにトークンが含まれている必要があります
  • トークン更新のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • リクエストボディにトークンが提供されていることを検証
  • JWTを使用してトークンを復号化して検証
  • トークンがステートフル(一回限りトークン)であることを検証
  • データベースでトークンの無効化ステータスを更新
  • 成功時に復元されたトークンを返す
  • トークン検証とデータベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { restoreOnetimeToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(restoreOnetimeToken, someTerminator);

invalidateOnetimeToken

一回限りトークンを無効化します。

目的: 一回限りトークンを永続的に無効化

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む
    • params.requestBody.token または context.data.token または context.token: 無効化するトークン
    • params.requestBody.fingerprint または context.data.fingerprint または context.fingerprint: セキュリティフィンガープリント
    • context.db: データベース接続
    • context.configuration.authSecrets: 認証シークレット

戻り値: Result<RouteHandlerPayload, Error> - 無効化されたトークンを含む成功またはエラー

ペイロード要件:

  • トークンとフィンガープリントが提供される必要があります
  • トークン更新のためにcontext.dbが利用可能である必要があります
  • context.configuration.authSecretsが利用可能である必要があります

主要機能:

  • トークンとフィンガープリントが提供されていることを検証
  • JWTを使用してトークンを復号化して検証
  • トークンがステートフル(一回限りトークン)であることを検証
  • データベースでトークンの無効化ステータスを更新
  • 成功時に無効化されたトークンを返す
  • トークン検証とデータベースエラーを処理

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { invalidateOnetimeToken } = handlers;

// コンポジションでの使用
const authPipeline = compose(invalidateOnetimeToken, someTerminator);

buildCheckConfirmEmailTokenPayload

メール確認トークン検証用のペイロードを構築します。

目的: メール確認ワークフローのトークン検証を設定

パラメータ:

  • payload: RouteHandlerPayload - リクエストコンテキストとデータを含む

戻り値: Result<RouteHandlerPayload, Error> - checkToken設定を含む成功

ペイロード要件:

  • 特定の要件なし - このハンドラーは常に成功します

主要機能:

  • メール確認ターゲット付きでcheckToken設定をマージ
  • TARGET_CONFIRM_EMAIL定数をターゲットとして設定
  • エラー条件なし(常に成功)
  • checkToken設定を含む更新されたペイロードを返す
  • メール確認ワークフローの準備ステップとして使用

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { buildCheckConfirmEmailTokenPayload } = handlers;

// コンポジションでの使用
const authPipeline = compose(buildCheckConfirmEmailTokenPayload, checkToken, confirmEmail, confirmEmailTerminator);

ターミネーターハンドラー

loginTerminator

成功したログインレスポンスをフォーマットします。

目的: アクセストークン、リフレッシュトークン、ユーザーIDでログインレスポンスをフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error>

戻り値: アクセストークン、リフレッシュトークン、ユーザーIDを含むフォーマット済みレスポンス

使用例:

compose(loginWithCredentials, createAccessToken, createRefreshToken, loginTerminator);

registerTerminator

成功した登録レスポンスをフォーマットします。

目的: アクセストークン、リフレッシュトークン、ユーザーIDで登録レスポンスをフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error>

戻り値: アクセストークン、リフレッシュトークン、ユーザーIDを含むフォーマット済みレスポンス

使用例:

compose(registerCredentials, createAccessToken, createRefreshToken, registerTerminator);

emailSentTerminator

成功したメール送信レスポンスをフォーマットします。

目的: 確認メール送信成功のメッセージをフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error>

戻り値: 成功メッセージを含むフォーマット済みレスポンス

logoutTerminator

成功したログアウトレスポンスをフォーマットします。

目的: ログアウト成功確認をフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error>

戻り値: ログアウト成功メッセージを含むフォーマット済みレスポンス


confirmEmailTerminator

メール確認プロセスを適切なステータスコードで終了します。

目的: 204ステータスで成功したメール確認レスポンスをフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error> - ペイロードまたはエラーを含む結果
    • context.data.confirmEmail: 前のハンドラーからの確認結果

戻り値: 204 statusCodeを含むレスポンスオブジェクト

ペイロード要件:

  • context.data.confirmEmailが前のハンドラーから利用可能であること

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { confirmEmailTerminator } = handlers;

// コンポジションでの使用
const authPipeline = compose(checkToken, confirmEmail, confirmEmailTerminator);

sendVerificationEmailTerminator

メール送信プロセスを適切なステータスコードで終了します。

目的: 204ステータスで成功したメール送信レスポンスをフォーマット

パラメータ:

  • result: Result<RouteHandlerPayload, Error> - ペイロードまたはエラーを含む結果
    • context.data.sendVerificationEmail: 前のハンドラーからのメール送信結果
    • context.data.token: 前のハンドラーからの生成されたトークン

戻り値: 204 statusCodeを含むレスポンスオブジェクト

ペイロード要件:

  • context.data.sendVerificationEmailtokenが前のハンドラーから利用可能であること

使用方法:

import { handlers } from '@nodeblocks/backend-sdk';

const { sendVerificationEmailTerminator } = handlers;

// コンポジションでの使用
const authPipeline = compose(sendVerificationEmail, sendVerificationEmailTerminator);

🔗 関連ドキュメント