# ソーシャルログイン（Google / Apple）セットアップ手順

`/login`・`/signup` への Google / Apple ログイン追加、および `/mypage` での
アカウント連携機能を本番稼働させるための手順。

## 1. DBマイグレーション（必須）

連携情報を保持する `member_social_links` テーブルを作成する。

```bash
psql -h <host> -U <user> -d payment-system \
  -f src/release/social_auth/dbsetting/01_member_social_links.sql
```

※ 開発環境（Docker）は `containers/postgresql11/init_db/payment-system.sql` に
同等DDLを追記済みのため、DB初期化で自動作成される。

## 2. Firebase コンソール設定

プロジェクト: `opcon-b0675`（`FIREBASE_PROJECT_ID`）。設定値は
`src/dat/lib/setsiteinfo.php` の `FIREBASE_API_KEY` / `FIREBASE_AUTH_DOMAIN` /
`FIREBASE_PROJECT_ID` に定義済み。

### 2-1. 承認済みドメイン
Firebase Console → Authentication → Settings → 承認済みドメイン に
`opcon.jp`（およびステージング/開発ドメイン）を追加する。

### 2-2. Google プロバイダ
Authentication → Sign-in method → Google を「有効」にする。
※ LP購入モーダルで既に利用中のため、通常は設定済み。

### 2-3. Apple プロバイダ（Appleログインを使う場合は必須）
Apple ログインは **Firebase コンソール側の Apple provider 設定が完了するまで
動作しない**（ボタン押下で `auth/operation-not-allowed` になる）。

必要なもの（Apple Developer Program 登録が前提）:
1. **Service ID**（例: `jp.opcon.signin`）を作成し「Sign In with Apple」を有効化
2. Return URL に `https://opcon-b0675.firebaseapp.com/__/auth/handler` を登録
3. **Sign in with Apple 用の Key（.p8）** を作成し、Key ID / Team ID を控える
4. Firebase Console → Authentication → Sign-in method → Apple を有効化し、
   Service ID・Team ID・Key ID・秘密鍵（.p8）を登録

設定が完了するまで Apple ボタンを非表示にしたい場合は、
`src/dat/lib/firebase_auth.php` の `SOCIAL_AUTH_APPLE_ENABLED` を `false` にする。

## 3. 仕様メモ

- 認証方式: フロントエンドが Firebase Authentication（compat SDK 10.12.0）で
  サインインし、取得した IDトークン（RS256 JWT）をサーバーが検証する
  （`verifyFirebaseIdToken()`。既存 `lp/webroot/purchase/api/google_auth.php`
  と同じ検証ロジックを共通化）。
- ログイン/新規登録（`/social_auth.php`）: 検証済みメールで会員を照合し、
  既存会員はログイン、未登録なら会員を自動作成（パスワードはランダム）。
  既存のメール＋パスワード＋2段階認証フローには影響しない。
- 連携（`/social_link.php`）/解除（`/social_unlink.php`）: マイページの
  ログイン済みユーザー専用。1会員で Google・Apple を両方連携可能。
- パスワードログインの会員がソーシャル連携しても、パスワードログインは引き続き利用可能。
- ソーシャルのみで作成された会員がパスワードログインしたい場合は
  「パスワードを忘れた方」から再設定する。

## 4. セキュリティ

- IDトークンは alg(RS256)/iss/aud/exp/iat/sub/email/署名 をサーバー検証。
- CSRF は `CsrfValidateClass::validateForOuterSites()` で全エンドポイント検証。
- 連携時は同一プロバイダUIDが他会員に紐づいていないかを検証（乗っ取り防止）。
- リダイレクト先 `ol` はホワイトリスト整形のうえ `BASE_URL` 配下に限定（オープンリダイレクト防止）。
