# Configuration Laravel Passport pour PKCE

## Problème de Sécurité Résolu

Au lieu d'exposer le `client_secret` dans le plugin WordPress, nous utilisons maintenant **PKCE (Proof Key for Code Exchange)** qui est la méthode sécurisée recommandée pour les clients publics.

## 1. Créer un Client Public dans Laravel

```php
// Dans votre seeder ou commande artisan
use Laravel\Passport\Client;

$client = Client::create([
    'name' => 'CODPartner WordPress Plugin',
    'secret' => null, // Pas de secret pour les clients publics
    'redirect' => 'https://example.com/wp-admin/admin.php?page=codpartner-settings',
    'personal_access_client' => false,
    'password_client' => false,
    'revoked' => false,
]);

echo "Client ID: " . $client->id; // Utilisez cette valeur dans votre plugin
```

## 2. Activer PKCE dans Passport (Laravel 8+)

```php
// Dans config/auth.php ou AuthServiceProvider
use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();
    
    // Activer PKCE pour tous les clients publics
    Passport::enableImplicitGrant();
    
    // Ou spécifiquement pour certains clients
    Passport::tokensExpireIn(now()->addDays(15));
    Passport::refreshTokensExpireIn(now()->addDays(30));
}
```

## 3. Modifier le Client existant pour PKCE

```php
// Migration ou commande pour convertir un client existant
use Laravel\Passport\Client;

$client = Client::find('83663'); // Votre client ID actuel
$client->secret = null; // Supprimer le secret
$client->save();
```

## 4. Middleware pour PKCE (optionnel)

```php
// Si vous voulez forcer PKCE pour certains clients
class RequirePkce
{
    public function handle($request, Closure $next)
    {
        if ($request->has('code_challenge')) {
            // PKCE détecté, continuer
            return $next($request);
        }
        
        // Pour les clients publics, PKCE est requis
        $client = Client::find($request->client_id);
        if ($client && is_null($client->secret)) {
            return response()->json([
                'error' => 'code_challenge_required',
                'error_description' => 'PKCE is required for public clients'
            ], 400);
        }
        
        return $next($request);
    }
}
```

## 5. Route personnalisée pour debug (développement)

```php
// Dans routes/web.php ou api.php
Route::get('/oauth/clients/{client}', function($clientId) {
    $client = \Laravel\Passport\Client::find($clientId);
    return [
        'id' => $client->id,
        'name' => $client->name,
        'secret' => $client->secret ? '[PROTECTED]' : null,
        'redirect' => $client->redirect,
        'is_public' => is_null($client->secret)
    ];
})->middleware('auth'); // Protégé en production
```

## 6. Test PKCE en local

```bash
# Test avec curl
curl -X POST https://api.codpartner.info/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "client_id=83663" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://example.com/wp-admin/admin.php?page=codpartner-settings" \
  -d "code_verifier=CODE_VERIFIER_FROM_PLUGIN"
```

## Avantages de cette Approche

✅ **Sécurisé**: Pas de secret exposé côté client  
✅ **Standard**: PKCE est le standard OAuth 2.1  
✅ **Simple**: Même expérience utilisateur  
✅ **Compatible**: Fonctionne avec Laravel Passport 9+  

## Configuration Plugin WordPress

Dans votre plugin, vous n'avez plus besoin que du `client_id`:

```php
define('CODPARTNER_CLIENT_ID', '83663');
// Plus besoin de CODPARTNER_CLIENT_SECRET !
```

## Vérification

Pour vérifier que tout fonctionne:

1. Le plugin génère automatiquement `code_challenge`
2. L'utilisateur est redirigé vers Laravel avec PKCE
3. Après autorisation, Laravel renvoie le `code`
4. Le plugin échange le `code` + `code_verifier` contre le token
5. **Aucun secret n'est exposé !** 