# Auth — Leaked Password Protection 有効化手順

Supabase Auth に組み込まれている [HaveIBeenPwned (HIBP)](https://haveibeenpwned.com/Passwords) 連携を ON にして、
過去に漏洩した既知のパスワードを登録 / 変更時に拒否する設定。

> **状況** (2026-04-27): dev / prod 両 project ともデフォルト OFF のため、Supabase advisor が
> `auth_leaked_password_protection` warning を継続的に出している。本書の手順を 2 project に
> 適用すれば warning は解消する。

## 概要

- HIBP の `Pwned Passwords` API (k-anonymity / SHA-1 prefix lookup) と連携。
- ユーザーが入力したパスワードの SHA-1 ハッシュ先頭 5 文字だけが Supabase 経由で HIBP に送られ、
  該当する漏洩済みハッシュ一覧を取得した後、Supabase 側で完全一致を判定する。
- 漏洩済みと判定されたパスワードは sign-up / password update いずれも reject される。
- パスワードそのものが外部に出ることはない。

## 適用手順 (dev project)

1. ブラウザで dev project の Auth Policies 画面を開く:
   - [https://supabase.com/dashboard/project/{dev-ref}/auth/policies](https://supabase.com/dashboard/project/{dev-ref}/auth/policies)
   - **TODO**: `{dev-ref}` を `.claude/context/env-values.md` の dev project ref に置換。
2. ページ内 **Password Strength** セクションまでスクロール。
3. **Prevent use of leaked passwords** トグルを ON。
4. **Save** クリック。
5. 同セクションの `Minimum password length` (8) と `Password requirements` (lowercase + uppercase + digit
   推奨) も同時に確認。

## 適用手順 (prod project)

dev と同じ手順を prod project に適用する:

1. [https://supabase.com/dashboard/project/{prod-ref}/auth/policies](https://supabase.com/dashboard/project/{prod-ref}/auth/policies)
2. **Password Strength** → **Prevent use of leaked passwords** = ON → **Save**.

> prod 適用前に dev で 1 週間ほど運用して UX 影響 (登録失敗率) を観測してから本番に投入する。

## 動作確認

- ブラウザで Mobile App / Owner Portal の sign-up フローを開き、**意図的に漏洩済みパスワード**を入力:
  - 例: `password123` / `qwerty123` / `letmein2023` 等の HIBP 既知パスワード
  - 期待: Supabase 側から `weak_password` 系のエラー (HTTP 422 / `AuthApiError`) が返る。
- 通常の十分強度のパスワード (e.g. `Parky-Test-2026!XYZ`) では従来どおり登録できることを確認。
- API 直叩きでの確認:
  ```bash
  curl -X POST "https://{ref}.supabase.co/auth/v1/signup" \
    -H "apikey: $SUPABASE_ANON_KEY" \
    -H "Content-Type: application/json" \
    -d '{"email":"test+leaked@parky.co.jp","password":"password123"}'
  # 期待: 422 + "weak_password" / "leaked password" 系のエラーメッセージ
  ```

## Limitations

- **HIBP API レート**: Supabase 側で k-anonymity bucket の応答をキャッシュしているため、
  通常の sign-up トラフィック (parky 想定 < 100 req/sec) ではレート上限に当たらない。
  急激なバースト時は `429` で fallback (= weak チェックのみ) になる可能性あり。
- **UX 影響**: 登録 / パスワード変更時に外部 API 通信 1 hop 増えるため、応答時間が
  おおよそ +150〜250ms (region によって変動)。
- **既存ユーザーには遡及されない**: ON にした時点で既に漏洩済みパスワードを使っているユーザーは
  ログインを継続できる。次回パスワード変更時に弾かれる仕様。
- **ローカル辞書攻撃の防止には別途レート制限が必要**: Supabase Auth の rate limit (現在
  100 req/5min/IP) と組み合わせて運用する。

## 関連

- Supabase advisor: `auth_leaked_password_protection` (本手順で resolved 化される)
- [Supabase Docs — Password Security](https://supabase.com/docs/guides/auth/password-security#preventing-the-use-of-compromised-passwords)
- [parky/docs/ops/auth-cookie-policy.md](./auth-cookie-policy.md) — 認証 Cookie のスコープと有効期限
- [parky/docs/ops/secret-rotation.md](./secret-rotation.md) — Auth 関連 secret の rotation 手順
