# Admin Panel Google Authentication Setup

Dokumentasi untuk setup Google OAuth di Filament admin panel.

## Fitur

✅ **Admin Login via Google** - Admin dapat login langsung menggunakan akun Google  
✅ **Role-based Access** - Hanya user dengan role `admin` yang dapat akses  
✅ **Non-admin Block** - User non-admin redirect ke landing page  
✅ **IP Whitelist (Optional)** - Blok akses dari IP yang tidak diizinkan  
✅ **Security** - Email verification otomatis untuk Google OAuth  

## Cara Kerja

### 1. Admin Login Flow

```
Admin membuka /admin
    ↓
Melihat custom login page dengan 2 opsi:
  - Login dengan Google
  - Login tradisional (email + password)
    ↓
Klik "Login dengan Google"
    ↓
Redirect ke Google OAuth
    ↓
Google memverifikasi akun
    ↓
Kembali ke aplikasi dengan user data
    ↓
Sistem cek apakah user adalah admin
    ↓
JA: Login ke dashboard admin
TIDAK: Redirect ke landing page dengan error message
```

### 2. Keamanan

#### Pengecekan Admin Role
- User harus memiliki `role = 'admin'` atau email dalam whitelist khusus
- File: `app/Models/User.php` → `canAccessPanel()` method

#### IP Whitelist (Optional)
- Aktifkan dengan `ADMIN_IP_WHITELIST_ENABLED=true` di `.env`
- Configure IPs di `ADMIN_IP_WHITELIST` (comma-separated)
- Default: hanya allow localhost dan ::1

## Konfigurasi

### Environment Variables (.env)

```env
# Google OAuth (sudah ada)
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
GOOGLE_REDIRECT_URI=http://localhost:8000/auth/google/callback

# Admin IP Whitelist (opsional)
ADMIN_IP_WHITELIST_ENABLED=false
ADMIN_IP_WHITELIST=192.168.1.1,10.0.0.5
```

### Mengaktifkan IP Whitelist

**Jika ingin blok dari luar (hanya internal network):**

1. Edit `.env`:
```env
ADMIN_IP_WHITELIST_ENABLED=true
ADMIN_IP_WHITELIST=192.168.1.0/24,10.0.0.0/8
```

2. Atau untuk production:
```env
ADMIN_IP_WHITELIST_ENABLED=true
ADMIN_IP_WHITELIST=203.0.113.50,198.51.100.100
```

**Default (tanpa konfigurasi):**
- Localhost (`127.0.0.1`, `::1`) always allowed
- Semua IP lain dibolehkan jika `ADMIN_IP_WHITELIST_ENABLED=false`

## Routes

### Public Routes
- `GET /auth/{provider}/redirect` - Website login redirect  
- `GET /auth/{provider}/callback` - OAuth callback

### Admin Routes
- `GET /auth/{provider}/admin-redirect` - Admin login redirect  
- `GET /admin` - Admin panel

## Files Dibuat/Modified

### Baru Dibuat:
- `app/Filament/Pages/Auth/CustomLogin.php` - Custom login page class
- `resources/views/filament/pages/auth/login.blade.php` - Login UI dengan Google button
- `app/Http/Middleware/AdminIpWhitelist.php` - IP whitelist middleware
- `config/admin.php` - Admin configuration file

### Modified:
- `app/Http/Controllers/SocialAuthController.php` - Add admin OAuth handling
- `app/Providers/Filament/AdminPanelProvider.php` - Register custom login page & middleware
- `routes/web.php` - Add admin OAuth route
- `.env.example` - Add new environment variables

## Testing

### Test Admin Google Login

1. **Setup Google OAuth di Google Cloud Console**
   - Buat project di https://console.cloud.google.com
   - Enable Google+ API
   - Create OAuth 2.0 credentials (Web Application)
   - Set authorized redirect URI: `http://localhost:8000/auth/google/callback`

2. **Add Admin User to Database**
```php
// Using tinker
php artisan tinker

User::create([
    'name' => 'Admin User',
    'email' => 'admin@example.com', // Email Google Anda
    'role' => 'admin',
    'provider' => 'google',
    'provider_id' => 'your_google_id',
    'email_verified_at' => now(),
    'password' => null,
]);
```

3. **Test Login**
   - Buka http://localhost:8000/admin
   - Klik "Login dengan Google"
   - Gunakan akun Google yang sesuai dengan email di database
   - Seharusnya redirect ke admin dashboard

### Test Non-Admin Rejection

1. **Buat user non-admin**
```php
User::create([
    'name' => 'Regular User',
    'email' => 'user@example.com',
    'role' => 'user',
    'provider' => 'google',
    'provider_id' => 'some_google_id',
    'email_verified_at' => now(),
    'password' => null,
]);
```

2. **Test Login**
   - Buka http://localhost:8000/admin
   - Login dengan akun non-admin
   - Seharusnya redirect ke landing page dengan error message

## Troubleshooting

### "Email Google Anda tidak terdaftar sebagai admin"
- User harus di-add ke database terlebih dahulu
- User harus memiliki `role = 'admin'`

### Google Login tidak bekerja
- Pastikan `GOOGLE_CLIENT_ID` dan `GOOGLE_CLIENT_SECRET` benar
- Pastikan `GOOGLE_REDIRECT_URI` sesuai dengan authorized redirect URI di Google Cloud
- Check logs: `storage/logs/laravel.log`

### IP Whitelist error
- Pastikan `ADMIN_IP_WHITELIST_ENABLED=true` jika ingin enable
- Format IP harus benar (comma-separated)
- Check current IP dengan debug di middleware

## Notes

- Session timeout: configure di `.env` dengan `SESSION_LIFETIME=120` (dalam menit)
- Custom login view bisa di-customize di `resources/views/filament/pages/auth/login.blade.php`
- Password login masih available jika diperlukan backup
