# ソーシャルログイン（OAuth 2.0）

## 概要

LINE・Twitter/X・Google の OAuth 2.0 を利用したソーシャルログイン機能。Laravel Socialite ベースで、既存アカウントへの紐付け・新規ユーザー自動作成に対応。

## URL一覧

| ページ | URL | 説明 |
|--------|-----|------|
| ログイン | `/login` | ソーシャルログインボタン表示 |
| リダイレクト | `/auth/{provider}/redirect` | OAuth 認可画面へリダイレクト |
| コールバック | `/auth/{provider}/callback` | OAuth コールバック処理 |

`{provider}` は `line` / `twitter` / `google` のいずれか。

## 認証フロー

```
ユーザー → ログイン画面 → [プロバイダ選択]
  → /auth/{provider}/redirect → プロバイダ認可画面
  → コールバック → /auth/{provider}/callback
  → DB処理 → ホームへリダイレクト
```

### コールバック時の処理分岐

1. **既存 SocialAccount あり** → アバター等を更新し、紐付くユーザーでログイン
2. **ログイン中** → 現在のユーザーに SocialAccount を新規紐付け
3. **メールアドレス一致** → 既存ユーザーに SocialAccount を紐付けてログイン
4. **該当なし** → 新規ユーザー + SocialAccount を作成してログイン

## データベース

### social_accounts テーブル

| カラム | 型 | 説明 |
|--------|-----|------|
| `id` | bigint | PK |
| `user_id` | FK → users | 紐付くユーザー |
| `provider` | string | line / twitter / google |
| `provider_id` | string | プロバイダ側のユーザーID |
| `name` | string? | プロバイダ側の表示名 |
| `avatar` | string? | アバターURL |

UNIQUE: `(provider, provider_id)`

マイグレーション: `2026_04_17_130000_create_social_accounts_table.php`

## 設定

### .env（各プロバイダの OAuth クライアント情報）

```
# LINE Login
LINE_LOGIN_CLIENT_ID=1234567890
LINE_LOGIN_CLIENT_SECRET=xxxxx

# Twitter/X (OAuth 2.0)
TWITTER_LOGIN_CLIENT_ID=xxxxx
TWITTER_LOGIN_CLIENT_SECRET=xxxxx

# Google
GOOGLE_LOGIN_CLIENT_ID=xxxxx.apps.googleusercontent.com
GOOGLE_LOGIN_CLIENT_SECRET=GOCSPX-xxxxx
```

### config/services.php

各プロバイダの `client_id` / `client_secret` / `redirect` が設定されている。
リダイレクトURLは `/auth/{provider}/callback` にルーティング済み。

### プロバイダ別のセットアップ

| プロバイダ | コンソールURL | リダイレクトURI |
|-----------|-------------|----------------|
| LINE | https://developers.line.biz/console/ | `https://yoursite.com/auth/line/callback` |
| Twitter/X | https://developer.x.com/en/portal/dashboard | `https://yoursite.com/auth/twitter/callback` |
| Google | https://console.cloud.google.com/apis/credentials | `https://yoursite.com/auth/google/callback` |

## ファイル構成

```
app/
├── Http/Controllers/Auth/
│   └── SocialLoginController.php    # OAuth リダイレクト・コールバック処理
├── Models/Core/
│   ├── SocialAccount.php            # ソーシャルアカウントモデル
│   └── User.php                     # socialAccounts リレーション追加
└── Providers/
    └── AppServiceProvider.php       # Socialite プロバイダ設定

resources/
├── css/auth/login.css               # ソーシャルログインボタンのスタイル
└── views/auth/login.blade.php       # ログイン画面（ソーシャルボタン付き）

config/services.php                  # OAuth クライアント設定
```

## ソーシャルログイン ON/OFF 設定

管理画面（`/admin/feature-setting`）から「ソーシャルログインを有効にする」トグルで、ログイン画面のソーシャルログインボタンの表示/非表示を制御できる。

| 設定 | カラム | デフォルト | 説明 |
|------|--------|-----------|------|
| ソーシャルログインを有効にする | `feature_settings.enable_social_login` | `true` | `false` にするとログイン画面の LINE / X / Google ボタンが非表示になる |

マイグレーション: `2026_04_29_120000_add_enable_social_login_to_feature_settings_table.php`

ビュー側では `@if(($feature_setting->enable_social_login ?? true))` で分岐しており、設定レコードが存在しない場合もデフォルト有効として動作する。

## 技術的な注意事項

- Twitter は OAuth 2.0（`twitter-oauth-2` ドライバ）を使用
- メールアドレスを返さないプロバイダの場合、合成メール `{provider}_{id}@social.invalid` で User を作成
- パスワードはランダム32文字で生成（ソーシャルログインのみ利用する想定）
- ログイン時に `session()->regenerate()` でセッション固定攻撃を防止
