パスワードリセット

概要説明

パスワードリセット機能は、ユーザーが忘れたパスワードを安全に回復するためのメールベースのシステムを提供します。このプロセスには、リセットトークンの生成、メール送信、トークン検証、および新しいパスワードの設定が含まれます。

アクティビティ図

flowchart TD
    A[ユーザーがパスワードリセットを要求] --> B{メールは有効?}
    B -->|いいえ| C[メール検証エラーを返す]
    B -->|はい| D[ユーザーが存在?]
    D -->|いいえ| E[ユーザーが見つからないエラーを返す]
    D -->|はい| F[リセットトークンを生成]
    
    F --> G[トークンをデータベースに保存]
    G --> H[リセットメールを送信]
    H --> I{メール送信は成功?}
    I -->|いいえ| J[メール送信エラーを返す]
    I -->|はい| K[成功レスポンスを返す]
    
    L[ユーザーがリセットリンクをクリック] --> M{トークンは有効?}
    M -->|いいえ| N[無効なトークンエラーを返す]
    M -->|はい| O[新しいパスワードの検証]
    O --> P{パスワードは有効?}
    P -->|いいえ| Q[パスワード検証エラーを返す]
    P -->|はい| R[パスワードを更新]
    R --> S[トークンを無効化]
    S --> T[成功レスポンスを返す]
    
    style A fill:#e1f5fe
    style K fill:#c8e6c9
    style T fill:#c8e6c9
    style C fill:#ffcdd2
    style E fill:#ffcdd2
    style J fill:#ffcdd2
    style N fill:#ffcdd2
    style Q fill:#ffcdd2

シーケンス図

パスワードリセット要求

sequenceDiagram
    participant Client
    participant ForgotController
    participant AuthService
    participant Database
    participant EmailService

    Client->>ForgotController: POST /api/v1/general/auth/forgot
    Note over Client,ForgotController: {email, url}
    
    ForgotController->>ForgotController: リクエストの検証
    ForgotController->>AuthService: sendResetLink(email, url)
    
    AuthService->>Database: ユーザーの存在チェック
    Database-->>AuthService: ユーザーデータ
    
    AuthService->>AuthService: リセットトークンを生成
    AuthService->>Database: トークンを保存
    Database-->>AuthService: 確認
    
    AuthService->>EmailService: リセットメールを送信
    EmailService-->>AuthService: 送信確認
    
    AuthService-->>ForgotController: 成功
    ForgotController->>Client: 200 OK

トークンでパスワードリセット

sequenceDiagram
    participant Client
    participant ResetController
    participant AuthService
    participant Database
    participant Firebase

    Client->>ResetController: POST /api/v1/general/auth/reset
    Note over Client,ResetController: {token, password}
    
    ResetController->>ResetController: リクエストの検証
    ResetController->>AuthService: resetPassword(token, email, password)
    
    AuthService->>Database: トークンの検証
    Database-->>AuthService: トークンデータ
    
    AuthService->>Firebase: パスワードを更新
    Firebase-->>AuthService: 確認
    
    AuthService->>Database: トークンを無効化
    Database-->>AuthService: 確認
    
    AuthService-->>ResetController: 成功
    ResetController->>Client: 200 OK

ステップ

  1. パスワードリセット要求: ユーザーがメールアドレスを提供
  2. ユーザー検証: メールアドレスがシステムに登録されているかチェック
  3. トークン生成: 一意のリセットトークンを生成
  4. トークン保存: データベースにトークンと有効期限を保存
  5. メール送信: リセットリンクを含むメールを送信
  6. トークン検証: ユーザーがリンクをクリックした際にトークンを検証
  7. パスワード更新: 新しいパスワードを設定
  8. トークン無効化: 使用済みトークンを無効化

データベース関連テーブルとフィールド

erDiagram
    users {
        bigint id PK "主キー"
        varchar name "ユーザーのフルネーム"
        varchar email UK "ユーザーのメールアドレス(一意)"
        varchar uid "Firebase UID"
        varchar payment_provider_customer_id "決済プロバイダーの顧客ID"
        tinyint status "ユーザーステータス (1: アクティブ, 0: 非アクティブ)"
        varchar remember_token "Laravelリメンバートークン"
        timestamp created_at "作成タイムスタンプ"
        timestamp updated_at "最終更新タイムスタンプ"
        timestamp deleted_at "ソフト削除タイムスタンプ"
        boolean is_first_login "初回ログインフラグ"
    }
    
    password_resets {
        varchar email PK "ユーザーのメール"
        varchar token "リセットトークン"
        timestamp created_at "トークン作成タイムスタンプ"
    }
    
    users ||--o{ password_resets : "要求する"

APIエンドポイント

パスワードリセット要求

  • URL: POST /api/v1/general/auth/forgot
  • ヘッダー: Content-Type: application/json
  • ボディ:
    {
      "email": "user@example.com",
      "url": "https://example.com/reset-password"
    }
    

パスワードリセット

  • URL: POST /api/v1/general/auth/reset
  • ヘッダー: Content-Type: application/json
  • ボディ:
    {
      "token": "reset_token_here",
      "email": "user@example.com",
      "password": "new_password_here"
    }
    

レスポンス

成功レスポンス(パスワードリセット要求)

  • ステータス: 200 OK
  • ボディ:
    {
      "message": "パスワードリセットリンクがメールで送信されました。"
    }
    

成功レスポンス(パスワードリセット)

  • ステータス: 200 OK
  • ボディ:
    {
      "message": "パスワードが正常にリセットされました。"
    }
    

エラーハンドリング

HTTPステータス エラーコード 説明
400 VALIDATION_ERROR 無効なメール形式または必須フィールドの不足
404 USER_NOT_FOUND メールアドレスがシステムに登録されていない
422 INVALID_TOKEN 無効または期限切れのリセットトークン
400 PASSWORD_VALIDATION_ERROR 新しいパスワードが要件を満たしていない
500 INTERNAL_SERVER_ERROR パスワードリセットプロセス中のサーバーエラー

追加ノート

  • トークンセキュリティ: リセットトークンは一意で、24時間後に期限切れ
  • メール統合: システムは設定されたメールサービスを使用してリセットリンクを送信
  • Firebase統合: パスワード更新はFirebase認証システムを通じて処理
  • レート制限: リセット要求はIPアドレスごとに1時間に3回に制限
  • トークン無効化: 使用済みトークンは即座に無効化され、再利用できない
  • セキュリティ監査: パスワードリセット試行はセキュリティログに記録
  • ユーザー通知: パスワード変更後、ユーザーに確認メールが送信される