# Coaster World — Connexion Google / Apple (v1.115.0)

## 1. Base de données

Exécuter la migration Laravel :

```bash
php artisan migrate
```

Alternative MySQL manuelle : `database/migrations/sql/coaster_world_v1.115.0_social_auth.sql`.

La migration rend `users.password` nullable pour les comptes créés uniquement avec Google/Apple et crée `user_auth_providers`. Aucun access token ni refresh token Google/Apple n'est conservé en base.

## 2. Google

Créer un client OAuth 2.0 de type **Web application** dans Google Cloud et déclarer l'URI de redirection exacte du site.

Variables `.env` :

```dotenv
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=https://coaster-world.com/auth/google/callback
```

Pour un environnement de test, l'URI configurée chez Google doit correspondre exactement à celle utilisée par Laragon.

## 3. Apple

Dans Apple Developer, activer **Sign in with Apple**, créer/configurer le **Services ID** utilisé par le site, le domaine et l'URI de retour, puis créer une clé privée Sign in with Apple.

Variables `.env` :

```dotenv
APPLE_CLIENT_ID=
APPLE_TEAM_ID=
APPLE_KEY_ID=
APPLE_PRIVATE_KEY_PATH=C:/chemin/securise/AuthKey_XXXXXXXXXX.p8
APPLE_REDIRECT_URI=https://coaster-world.com/auth/apple/callback
```

`APPLE_PRIVATE_KEY` peut remplacer `APPLE_PRIVATE_KEY_PATH` si l'hébergeur impose une clé dans l'environnement. Ne jamais placer le fichier `.p8` dans `public/` ni dans une archive de livraison.

Apple impose un domaine web enregistré et une URL de retour HTTPS ; son flux web renvoie le callback en POST (`response_mode=form_post`). La route Apple est donc exclue du CSRF Laravel classique, mais elle reste protégée par les contrôles OAuth `state` et OpenID Connect `nonce`, ainsi que par la vérification cryptographique du jeton d'identité.

## 4. Après configuration

```bash
php artisan config:clear
php artisan cache:clear
```

Vérifier ensuite :

- création d'un compte avec Google ;
- création d'un compte avec Apple ;
- connexion avec un fournisseur déjà associé ;
- association Google/Apple depuis **Paramètres du compte → Sécurité** ;
- refus de création d'un doublon quand l'e-mail existe déjà ;
- création d'un mot de passe sur un compte social-only ;
- impossibilité de supprimer la dernière méthode de connexion.

## 5. Application mobile — connexion Google par navigateur sécurisé

Depuis v1.127.0, l'application mobile réutilise directement le flux OAuth Web du site au lieu de dépendre du SDK Google Sign-In natif Android. Le client OAuth **Web** et l'URI déjà déclarée `https://coaster-world.com/auth/google/callback` restent la source de vérité.

Le démarrage mobile utilise `GET /auth/google/mobile/redirect?challenge=...`. Le serveur conserve le challenge PKCE-like dans la session du navigateur, effectue l'authentification Google, puis renvoie un ticket éphémère à l'application via `coasterworld://auth/google`. L'application échange ce ticket via `POST /api/v1/auth/google/ticket` avec son `code_verifier`.

Sécurité :

- ticket aléatoire expirant après 2 minutes ;
- ticket utilisable une seule fois (`Cache::pull`) ;
- vérification du challenge SHA-256 avant émission du jeton mobile ;
- aucun access token, refresh token ou secret OAuth Google n'est exposé à l'application ;
- seul un Google déjà présent dans `user_auth_providers` peut ouvrir le compte mobile correspondant ;
- aucune association automatique sur simple correspondance d'e-mail.

Le client OAuth Android créé précédemment peut rester dans Google Cloud, mais il n'est plus nécessaire pour ce flux navigateur.
