パスワードリセット
概要説明
パスワードリセット機能は、ユーザーが忘れたパスワードを安全に回復するためのメールベースのシステムを提供します。このプロセスには、リセットトークンの生成、メール送信、トークン検証、および新しいパスワードの設定が含まれます。
アクティビティ図
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
ステップ
- パスワードリセット要求: ユーザーがメールアドレスを提供
- ユーザー検証: メールアドレスがシステムに登録されているかチェック
- トークン生成: 一意のリセットトークンを生成
- トークン保存: データベースにトークンと有効期限を保存
- メール送信: リセットリンクを含むメールを送信
- トークン検証: ユーザーがリンクをクリックした際にトークンを検証
- パスワード更新: 新しいパスワードを設定
- トークン無効化: 使用済みトークンを無効化
データベース関連テーブルとフィールド
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回に制限
- トークン無効化: 使用済みトークンは即座に無効化され、再利用できない
- セキュリティ監査: パスワードリセット試行はセキュリティログに記録
- ユーザー通知: パスワード変更後、ユーザーに確認メールが送信される