コンテンツにスキップ

パスワード忘れ

メソッド

REST メソッドを採用しています。

HTTP メソッド

POST: パスワードリセット要求

命名規則

クエリパラメータとノードの命名を統一し、可読性を向上させるため、リクエスト時の URI と JSON 内のノードには snake_case を使用します。

リクエストとレスポンス

ヘッダー

メタ情報はレスポンスボディではなく、HTTP ヘッダーに設定されます。

リクエストヘッダー

  • Content-Type: application/json

レスポンスヘッダー

  • Content-Type: application/json

パスワード忘れ

URI

/api/v1/auth/forgot_password

リクエストボディ

リクエストボディは JSON です。

{
  "email": "admin@example.com"
}

バリデーションルール

フィールド ルール
email 必須。有効なメール形式であること。

レスポンス(200 OK)

レスポンスは JSON です。

{
  "message": "Password reset code sent",
  "code_delivery_destination": "a***@example.com",
  "code_delivery_medium": "EMAIL"
}

注: メールアドレスが存在するかどうかに応じてレスポンスは変わりません。ユーザー列挙攻撃を防ぐためです。メールが見つかった場合のみ code_delivery_destination と code_delivery_medium が含まれます。

認証要件

このエンドポイントは認証を要求しません。

例外処理

例外時のステータスコードは次のとおりです。

説明 ステータスコード ステータス名
メール形式が不正 400 Bad Request
サーバ内部エラー 500 Internal Server Error

処理フロー

シーケンス図

sequenceDiagram
    participant Client
    participant API as Hono Router
    participant Validate as Zod Validation
    participant Service as Auth Service
    participant Cognito as AWS Cognito

    Client->>API: POST /api/v1/auth/forgot_password
    API->>Validate: Validate email
    Validate-->>API: Validation passed

    API->>Service: forgotPassword(email)
    Service->>Cognito: forgotPassword(email)

    alt Email Exists
        Cognito-->>Service: Code sent (delivery details)
        Service-->>API: { message, codeDeliveryDestination, codeDeliveryMedium }
        API-->>Client: 200 OK
    else Email Not Found
        Cognito-->>Service: UserNotFoundException
        Service-->>API: { message: "If the email exists..." }
        API-->>Client: 200 OK (same response format)
    end

Routes 層

ルーティングはここで行います。Zod スキーマでメールフィールドを検証し、認証サービスに委譲します。

ソース: src/routes/v1/auth.ts:104

Services 層

ビジネスロジックの説明です。AWS Cognito にパスワードリセットコードを要求し、メールに検証コードを送信します。レスポンスはユーザー列挙を防ぐためタイミングセーフです。

ソース: src/services/auth.ts

Repositories 層

外部サービスへのアクセスです。パスワード忘れフローで AWS Cognito と連携します。

ソース: src/repositories/

セキュリティ

  • メールの有無に関わらず同じレスポンスを返します(ユーザー列挙の防止)
  • 検証コードは設定された時間後に失効します
  • レート制限は API Gateway / Cognito 側で処理されます