メインコンテンツまでスキップ
バージョン: 0.9.0 (最新)

🛣️ 認証ルート

認証ルートは、NodeBlocksアプリケーションでユーザー認証と認可操作のための事前設定されたHTTPエンドポイントを提供します。これらのルートは、ブロック(純粋なビジネスロジック関数)、ハンドラー、バリデーター、ミドルウェアを組み合わせて、ログイン、登録、トークン管理、メール確認の完全なAPIエンドポイントを作成します。


🎯 概要

認証ルートは以下の目的で設計されています:

  • 完全なAPIエンドポイントの提供 - ユーザー認証操作用
  • ブロックとハンドラーをバリデーターと組み合わせる - 安全な操作のため
  • 認証と認可チェックを含む
  • 関数型コンポジションパターンのサポート
  • ログとエラー管理の自動処理

📋 ルート構造

各認証ルートは一貫したパターンに従います:

  • HTTPメソッド: 操作タイプを定義(GET、POST、PATCH、DELETE)
  • Path: パラメータを含むエンドポイントURLを指定
  • ハンドラー: ブロックとハンドラーを使用したコンポーズ関数チェーン
  • バリデーター: 認証と認可チェック

🔧 利用可能な認証ルート

registerCredentialsRoute

オプションの招待処理を含む新しいユーザー認証情報を登録します。

目的: 招待受け入れのサポートを含むユーザー登録を処理

ルート詳細:

  • Method: POST
  • Path: /auth/register
  • 認証: 不要

ハンドラー:

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.registerCredentialsRoute);

注意: 招待固有の機能については、招待ブロックを参照してください。


loginWithCredentialsRoute

オプションのMFAサポートを含む認証情報によるユーザー認証。

目的: 認証情報バリデーションとオプションの多要素認証を含むユーザーログインを処理

ルート詳細:

  • Method: POST
  • Path: /auth/login
  • 認証: 不要

認証フロー:

MFAが無効の場合(デフォルト):

  • 認証情報をバリデーション → アクセストークンを作成 → リフレッシュトークンを作成 → レスポンスCookieを設定 → ログインレスポンスを返す

MFAが有効の場合 (isMfaEnabled: true):

  • 認証情報をバリデーション → MFAコードを作成 → MFAトークンを作成 → メールでMFAコードを送信 → MFAトークンを返す

ハンドラー/ブロック (MFA有効):

ハンドラー (MFA無効):

バリデーター: なし

リクエストボディ (MFA無効):

{
"email": "user@example.com",
"password": "securePassword123",
"fingerprint": "device-fingerprint"
}

レスポンス (MFA無効):

{
"id": "identity-uuid",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

レスポンス (MFA有効):

{
"token": "encrypted-mfa-challenge-token"
}

主な機能 (MFA):

  • 設定可能なMFAコード長(デフォルト: 6桁)
  • 設定可能なMFAトークンの有効期限(デフォルト: 10分)
  • テンプレートベースのメールカスタマイズ
  • isMfaEnabled設定に基づく条件付きフロー
  • 自動MFAコード生成と配信

使用例:

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

// Register route with Express app
app.use('/api', routes.loginWithCredentialsRoute);

// Configure MFA in authentication service:
const authService = createAuthenticationService({
// ... other config
isMfaEnabled: true,
mfaCodeLength: 6,
mfaTokenExpireTime: '10m',
mfaCodeEmailConfig: {
sender: 'noreply@example.com',
emailConfig: {
subject: 'Your MFA Code',
bodyTemplate: 'Your verification code is: ${code}'
}
}
});

MFAフロー:

  1. ユーザーが認証情報を送信
  2. システムが認証情報をバリデーション
  3. MFAが有効な場合:
    • MFAコードを生成
    • MFAチャレンジトークンを作成
    • メールでコードを送信
    • MFAトークンをクライアントに返す
    • クライアントはトークンとMFAコードを送信する必要がある(別のエンドポイント)
  4. MFAが無効な場合:
    • アクセスとリフレッシュトークンを生成
    • トークンを直接返す

resendMfaCodeRoute

新しい確認コードが必要なユーザー向けにPOST /auth/mfa/resend経由でMFAコードを再送信します。

目的: 以前のコードを無効化しながら新しいMFAコードを生成して送信

ルート詳細:

  • Method: POST
  • Path: /auth/mfa/resend
  • 認証: 不要(MFAトークンを使用)

ハンドラー/ブロック:

バリデーター: なし

リクエストボディ:

{
"token": "encrypted-mfa-challenge-token"
}

レスポンス (成功):

{
"token": "new-encrypted-mfa-challenge-token"
}

エラーレスポンス:

  • 400 Bad Request: 無効なリクエストボディまたはトークンフォーマット
  • 401 Unauthorized: MFAトークンの有効期限切れまたは無効
  • 403 Forbidden: トークンが既に使用済みまたは間違ったターゲット
  • 404 Not Found: MFAトークンが見つからない、またはアイデンティティが見つからない
  • 500 Internal Server Error: コード再生成またはメール送信中に予期しないエラー

処理プロセス:

  1. MFAチャレンジターゲット定数を抽出
  2. リクエストヘッダーからデバイスフィンガープリントを取得
  3. MFAトークンを検証して復号化
  4. トークンがデータベースに存在し、まだ使用されていないことをバリデーション
  5. 古いMFAトークンを無効化(セキュリティ対策)
  6. トークンデータからユーザーアイデンティティを取得
  7. 新しい安全なMFAコードを生成
  8. 新しいMFAチャレンジトークンを作成して保存
  9. メールで新しいMFAコードを送信
  10. 新しいMFAトークンをクライアントに返す

主な機能:

  • セキュリティのために以前のMFAトークンを無効化
  • 完全に新しいMFAコードを生成(古いものを再利用しない)
  • 新しい有効期限で新しいMFAトークンを発行
  • 同じMFAワークフローのセキュリティを維持
  • トークン無効化による悪用を防止
  • 設定可能なコード長とトークンの有効期限

使用例:

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

// Register route with Express app
app.use('/api', routes.resendMfaCodeRoute);

// Typical resend flow:
// 1. User logs in (POST /auth/login) → receives MFA token
// 2. User requests resend (POST /auth/mfa/resend) → receives new MFA token
// 3. User receives new MFA code via email
// 4. User submits verification (POST /auth/mfa/verify) with new token and code

MFA再送信フロー:

Client                    Server
| |
| POST /auth/login |
|------------------------>|
| | - Validate credentials
| | - Generate MFA code
| | - Send code via email
| { token: "old-tkn" } | - Store code in token
|<------------------------|
| |
| User didn't receive |
| email or code expired |
| |
| POST /auth/mfa/resend |
| { token: "old-tkn" } |
|------------------------>|
| | - Verify old token
| | - Invalidate old token
| | - Generate NEW code
| | - Send NEW code email
| { token: "new-tkn" } | - Store in NEW token
|<------------------------|
| |
| User receives new code |
| via email: "654321" |
| |
| POST /auth/mfa/verify |
| { token: "new-tkn", |
| code: "654321" } |
|------------------------>|
| | - Verify token validity
| | - Compare codes
| | - Generate auth tokens
| { accessToken, ... } | - Invalidate MFA token
|<------------------------|

使用ケース:

  • ユーザーが初期MFAコードメールを受信しなかった
  • メール配信が遅延または失敗した
  • ユーザーが誤ってメールを削除した
  • ユーザーが入力する前にMFAコードが期限切れになった
  • ユーザーが一時的にメールへのアクセスを失った

注意事項:

  • 古いMFAトークンは再送信時にすぐに無効化される
  • 新しいMFAコードはセキュリティのために古いものとは異なる
  • トークンの有効期限タイマーは新しいトークンでリセットされる
  • ユーザーは再送信後に新しいトークンでのみ確認できる
  • メールテンプレートと送信者はサービスオプションで設定可能

verifyMfaCodeRoute

MFAコードを確認し、認証フローを完了します。

目的: ユーザーが送信したMFAコードを保存されたコードと照合し、認証トークンを発行

ルート詳細:

  • Method: POST
  • Path: /auth/mfa/verify
  • 認証: 不要(MFAトークンを使用)

ハンドラー/ブロック:

バリデーター: なし

リクエストボディ:

{
"token": "encrypted-mfa-challenge-token",
"code": "123456"
}

レスポンス (成功):

{
"id": "identity-uuid",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

エラーレスポンス:

  • 400 Bad Request: 無効なMFAコードが提供された
  • 401 Unauthorized: MFAトークンの有効期限切れまたは無効
  • 404 Not Found: MFAトークンが見つからない
  • 500 Internal Server Error: 確認中に予期しないエラー

処理プロセス:

  1. MFAチャレンジターゲット定数を抽出
  2. リクエストヘッダーからデバイスフィンガープリントを取得
  3. MFAトークンを検証して復号化
  4. トークンがデータベースに存在し、まだ使用されていないことをバリデーション
  5. トークンを無効化(ワンタイム使用)
  6. ユーザーが提供したコードと保存されたコードを比較
  7. ユーザーアイデンティティを取得
  8. アクセスとリフレッシュトークンを生成
  9. リフレッシュトークンCookieを設定
  10. 認証トークンを返す

主な機能:

  • ワンタイムトークン使用(確認後に無効化)
  • 安全なコード比較
  • 完全なMFAワークフロー
  • 標準ログインと同じトークン構造を返す
  • 自動トークン無効化により再利用を防止

使用例:

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

// Register route with Express app
app.use('/api', routes.verifyMfaCodeRoute);

// Complete MFA flow:
// 1. User logs in (POST /auth/login) → receives MFA token
// 2. User receives MFA code via email
// 3. User submits verification (POST /auth/mfa/verify)
// 4. System validates and returns access/refresh tokens

MFA確認フロー:

Client                    Server
| |
| POST /auth/login |
|------------------------>|
| | - Validate credentials
| | - Generate MFA code
| | - Send code via email
| { token: "..." } | - Store code in token
|<------------------------|
| |
| User receives code |
| via email: "123456" |
| |
| POST /auth/mfa/verify |
| { token, code } |
|------------------------>|
| | - Verify token validity
| | - Compare codes
| | - Generate auth tokens
| { accessToken, ... } | - Invalidate MFA token
|<------------------------|

logoutRoute

セッションを無効化し、トークンをクリアしてユーザーをログアウトします。

目的: ユーザーログアウトとセッションクリーンアップを処理

ルート詳細:

  • Method: POST
  • Path: /auth/logout
  • 認証: 必要(Bearerトークン)

ハンドラー: logout, logoutTerminator

バリデーター: isAuthenticated

使用例:

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

// Register route with Express app
app.use('/api', routes.logoutRoute);

refreshTokenRoute

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

目的: リフレッシュトークンから新しいアクセストークンを生成

ルート詳細:

  • Method: POST
  • Path: /auth/token/refresh
  • 認証: 不要

ハンドラー: refreshToken

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.refreshTokenRoute);

checkTokenRoute

アクセストークンをバリデーションしてそのステータスを返します。

目的: トークンの真正性とステータスをバリデーション

ルート詳細:

  • Method: POST
  • Path: /auth/token/check
  • 認証: 不要

ブロック: checkToken - 純粋なビジネスロジックを使用してトークンをバリデーション

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.checkTokenRoute);

deleteRefreshTokensRoute

DELETE /auth/:identityId/refresh-tokens経由で特定のアイデンティティのリフレッシュトークンを削除します。

目的: アイデンティティ管理とセキュリティのためにリフレッシュトークンを削除

ルート詳細:

  • Method: DELETE
  • Path: /auth/:identityId/refresh-tokens
  • 認証: 必要(Bearerトークン)

ブロック: softDeleteRefreshTokens - アイデンティティのリフレッシュトークンをソフト削除

バリデーター: isAuthenticated, some(checkIdentityType(['admin']), isSelf(['params', 'requestBody', 'identityId']))

使用例:

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

// Register route with Express app
app.use('/api', routes.deleteRefreshTokensRoute);

loginWithOnetimeTokenRoute

パスワードレス安全なログインのためのワンタイムトークン認証。

目的: ワンタイムトークンをバリデーションし、パスワードレス認証フローを完了

ルート詳細:

  • Method: POST
  • Path: /auth/ott/login
  • 認証: 不要(ワンタイムトークンを使用)

ハンドラー:

バリデーター: なし

リクエストボディ:

{
"token": "encrypted-onetime-authentication-token"
}

レスポンス (成功):

{
"id": "identity-uuid",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

エラーレスポンス:

  • 403 Forbidden: この操作に対してトークンが正しくない、無効なターゲット、または既に使用済み
  • 404 Not Found: アイデンティティが見つからない
  • 500 Internal Server Error: 認証中に予期しないエラー

処理プロセス:

  1. ワンタイムトークンがデータベースに存在することをバリデーション
  2. JWTトークン構造を復号化して検証
  3. トークンタイプが'onetime'であることを確認
  4. トークンターゲットが'login'であることを確認
  5. トークンデータからアイデンティティを取得
  6. トークンを無効化(ワンタイム使用)
  7. アクセスとリフレッシュトークンを生成
  8. リフレッシュトークンCookieを設定
  9. 認証トークンを返す

主な機能:

  • マジックリンク経由のパスワードレス認証
  • ワンタイムトークン使用(自動的に無効化)
  • タイプとターゲットチェックを含む安全なトークンバリデーション
  • 標準ログインと同じトークン構造を返す
  • トークンデータからのアイデンティティ検索

使用例:

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

// Register route with Express app
app.use('/api', routes.loginWithOnetimeTokenRoute);

// Typical magic link flow:
// 1. Generate one-time token with target: 'login' and identityId
// 2. Send magic link email with token
// 3. User clicks link → client submits POST /auth/ott/login with token
// 4. System validates and returns authentication tokens

マジックリンクフロー:

User                     Server
| |
| Request magic link |
| (separate endpoint) |
|------------------------>|
| | - Generate OTT token
| | - Store token in DB
| Magic link email | - Send email
|<------------------------|
| |
| Click link in email |
| |
| POST /auth/ott/login |
| { token } |
|------------------------>|
| | - Validate token
| | - Get identity
| | - Invalidate token
| { accessToken, ... } | - Generate auth tokens
|<------------------------|

generateOnetimeTokenRoute

認証目的で新しいワンタイムトークンを生成します。

目的: 認証用のOTTを作成(管理者のみ)

ルート詳細:

  • Method: POST
  • Path: /auth/ott/generate
  • 認証: 必要(Bearerトークン)

ハンドラー: generateOnetimeToken

バリデーター: isAuthenticated, checkIdentityType(['admin'])

使用例:

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

// Register route with Express app
app.use('/api', routes.generateOnetimeTokenRoute);

restoreOnetimeTokenRoute

以前に無効化されたワンタイムトークンを復元します。

目的: 無効化されたOTTを再有効化(管理者のみ)

ルート詳細:

  • Method: POST
  • Path: /auth/ott/restore
  • 認証: 必要(Bearerトークン)

ハンドラー: restoreOnetimeToken

バリデーター: isAuthenticated, checkIdentityType(['admin'])

使用例:

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

// Register route with Express app
app.use('/api', routes.restoreOnetimeTokenRoute);

invalidateOnetimeTokenRoute

既存のワンタイムトークンを無効化します。

目的: アクティブなOTTを無効化(管理者のみ)

ルート詳細:

  • Method: POST
  • Path: /auth/ott/invalidate
  • 認証: 必要(Bearerトークン)

ハンドラー: invalidateOnetimeToken

バリデーター: isAuthenticated, checkIdentityType(['admin'])

使用例:

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

// Register route with Express app
app.use('/api', routes.invalidateOnetimeTokenRoute);

sendVerificationEmailRoute

ユーザーに確認メールを送信します。

目的: メール確認プロセスをトリガー

ルート詳細:

  • Method: POST
  • Path: /auth/:identityId/send-verification-email
  • 認証: 必要(Bearerトークン)

ハンドラー: sendVerificationEmail, sendVerificationEmailTerminator

バリデーター: isAuthenticated, some(checkIdentityType(['admin']), isSelf(['params', 'requestParams', 'identityId']))

使用例:

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

// Register route with Express app
app.use('/api', routes.sendVerificationEmailRoute);

confirmEmailRoute

確認トークンを使用してユーザーのメールアドレスを確認します。

目的: メール確認トークンを処理

ルート詳細:

  • Method: POST
  • Path: /auth/confirm-email
  • 認証: 不要

ハンドラー: buildCheckConfirmEmailTokenPayload, checkToken, confirmEmail, confirmEmailTerminator

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.confirmEmailRoute);

changeEmailRoute

新しいアドレスに確認メールを送信してユーザーのメール変更プロセスを開始します。

目的: トークン生成とメール送信を含むメール変更の開始を処理

ルート詳細:

  • Method: PATCH
  • Path: /auth/:identityId/change-email
  • 認証: 必要(Bearerトークン)

ブロック:

バリデーター: isAuthenticated, some(checkIdentityType(['admin']), isSelf(['params', 'requestParams', 'identityId']))

使用例:

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

// Register route with Express app
app.use('/api', routes.changeEmailRoute);

confirmNewEmailRoute

ワンタイム確認トークンを使用してユーザーの新しいメールアドレスを確認します。

目的: トークンバリデーションを含むメール変更確認を処理

ルート詳細:

  • Method: POST
  • Path: /auth/confirm-new-email
  • 認証: 不要

ブロック:

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.confirmNewEmailRoute);

sendResetPasswordLinkEmailRoute

ユーザーのメールアドレスに基づいてパスワードリセットリンクメールを送信します。

目的: パスワードリセットメールの生成と送信を処理

ルート詳細:

  • Method: POST
  • Path: /auth/send-reset-password-link-email
  • 認証: 不要

ブロック:

バリデーター: なし

使用例:

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

// Register route with Express app
app.use('/api', routes.sendResetPasswordLinkEmailRoute);

changePasswordRoute

PATCH /auth/:identityId/change-password経由でユーザーパスワードを変更します。

目的: 現在のパスワード確認と新しいパスワードハッシュ化を含むパスワード変更を処理

ルート詳細:

  • Method: PATCH
  • Path: /auth/:identityId/change-password
  • 認証: 必要(Bearerトークン)

ブロック:

バリデーター: isAuthenticated, some(checkIdentityType(['admin']), isSelf(['params', 'requestParams', 'identityId']))

使用例:

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

// Use in feature composition:
export const changePasswordFeature = compose(changePasswordSchema, changePasswordRoute);

// Register route with Express app
app.use('/api', routes.changePasswordRoute);

activateRoute

POST /auth/activate経由でユーザーアカウントを有効化します。

目的: メール確認とアイデンティティステータス更新を含むアカウント有効化を処理

ルート詳細:

  • Method: POST
  • Path: /auth/activate
  • 認証: 必要(Bearerトークン)

ブロック:

バリデーター: isAuthenticated, checkIdentityType(['admin'])

使用例:

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

// Use in feature composition:
export const activateFeature = compose(activateSchema, activateRoute);

// Register route with Express app
app.use('/api', routes.activateRoute);

deactivateRoute

POST /auth/deactivate経由でユーザーアイデンティティを無効化します。

目的: メール確認、アイデンティティステータス更新、トークン無効化を含むアカウント無効化を処理

ルート詳細:

  • Method: POST
  • Path: /auth/deactivate
  • 認証: 必要(Bearerトークン)

ブロック:

バリデーター: isAuthenticated, some(checkIdentityType(['admin']), isSelf(['params', 'requestParams', 'identityId']))

使用例:

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

// Use in feature composition:
export const deactivateFeature = compose(deactivateSchema, routes.deactivateRoute);

// Register route with Express app
app.use('/api', routes.deactivateRoute);

completePasswordResetRoute

トークンをバリデーションしてユーザーのパスワードを更新することで、パスワードリセットプロセスを完了します。

目的: トークンバリデーションとパスワード更新を含むパスワードリセット完了を処理

ルート詳細:

  • Method: POST
  • Path: /auth/reset-password
  • 認証: 不要

ブロック:

バリデーター: なし

使用例:

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

// Route registration:
app.use('/api', routes.completePasswordResetRoute);

// POST /auth/reset-password
// Headers:
// Authorization: Bearer <one-time-token>
// Request body:
// {
// "password": "newStrongPassword123"
// }
// Response: 204 No Content (success)