Configuration Google — SSO restreint au domaine serpe.fr¶
Ce document décrit les actions manuelles à réaliser dans la console Google Cloud Platform (GCP) et dans le dashboard Supabase pour activer la connexion « Continuer avec Google », restreinte aux comptes du domaine de l'agence.
Ces actions ne peuvent pas être automatisées par l'agent : elles nécessitent un accès humain aux consoles GCP et Supabase. Suivez les étapes dans l'ordre.
Prérequis¶
- Un compte Google avec les droits nécessaires pour créer/gérer un projet GCP
(idéalement un Google Workspace du domaine
serpe.fr, pour pouvoir choisir un écran de consentement de type interne). - Accès admin au projet Supabase (voir
docs/SETUP_SUPABASE.md). - L'URL du projet Supabase, sous la forme
https://<project-ref>.supabase.co(le<project-ref>apparaît dans Project Settings > General du dashboard Supabase, et dansSUPABASE_URL).
Étape 1 — Créer/choisir un projet GCP¶
- Rendez-vous sur console.cloud.google.com.
- Créez un nouveau projet (ou réutilisez un projet existant dédié à Serpe).
Étape 2 — Activer l'API nécessaire¶
- Menu APIs & Services > Library.
- Recherchez Google Identity / Google People API (l'API OAuth de base est activée par défaut pour tout projet GCP ; l'important ici est surtout l'écran de consentement et l'identifiant client — voir étapes suivantes).
- Si vous prévoyez d'utiliser d'autres API Google (Drive, Vertex AI) pour le reste du projet Serpe, activez-les également ici, mais ce n'est pas requis pour le seul SSO.
Étape 3 — Configurer l'écran de consentement OAuth¶
- Menu APIs & Services > OAuth consent screen.
- Type d'utilisateur : choisissez Interne (« Internal »).
- Ce choix n'est disponible que si le projet GCP appartient à une organisation Google Workspace. Il garantit que seuls les comptes du Workspace peuvent apparaître dans l'écran de consentement Google — une première barrière, complémentaire à la vérification applicative (voir rappel de sécurité plus bas).
- Si vous n'avez pas de Workspace et devez utiliser le type Externe, la restriction de domaine repose alors entièrement sur le trigger PostgreSQL décrit plus bas : configurez-le sans faute.
- Renseignez le nom de l'application (ex. « Serpe — Gestion AO »), l'email d'assistance et l'email de contact développeur.
- Scopes : ajoutez les scopes suivants (scopes standards, non sensibles) :
.../auth/userinfo.email.../auth/userinfo.profileopenid- Enregistrez.
Étape 4 — Créer l'identifiant client OAuth 2.0¶
- Menu APIs & Services > Credentials.
- Create Credentials > OAuth client ID.
- Type d'application : Web application.
- Nom : ex. « Serpe — Supabase Auth ».
- Authorized redirect URIs — ajoutez exactement :
Remplacez
<project-ref>par la référence réelle du projet Supabase (visible dans l'URL du dashboard, ex.rnxuwktlbyczulacznoy). - Validez. Google affiche un Client ID et un Client Secret — copiez-les immédiatement, le secret ne sera plus affiché en clair ensuite.
Étape 5 — Brancher les identifiants dans Supabase¶
- Dashboard Supabase du projet Serpe > Authentication > Providers.
- Ouvrez Google, activez le provider.
- Collez le Client ID et le Client Secret obtenus à l'étape 4.
- Enregistrez.
À ce stade, le bouton « Continuer avec Google » de l'application (page
app/pages/login.vue) fonctionne : il appelle
supabase.auth.signInWithOAuth({ provider: 'google', options: { queryParams: { hd: 'serpe.fr', prompt: 'select_account' } } }).
Vertex AI (Gemini) — provider de génération¶
Gemini/Vertex AI est l'unique provider de génération du projet
(server/utils/generation/providers/gemini.ts). Il utilise le même projet
GCP que le SSO, mais un compte de service dédié.
- Menu IAM & Admin > Service Accounts > Create Service Account dans le même projet GCP.
- Attribuez-lui le rôle
Vertex AI User(roles/aiplatform.user) — c'est le rôle minimal permettant d'appelergenerateContentsur les modèles publiés (publishers/google/models/...). - Créez une clé JSON pour ce compte de service (Keys > Add key > Create new key > JSON) et téléchargez-la.
- En local : enregistrez le fichier téléchargé sous
service-account.jsonà la racine du projet (déjà ignoré par Git) et référencez-le viaGOOGLE_APPLICATION_CREDENTIALS=./service-account.jsondans.env— la librairiegoogle-auth-libraryle détecte automatiquement. - Sur Cloudflare Workers (pas de système de fichiers) : collez le
contenu JSON complet du fichier, sur une seule ligne, dans
GOOGLE_SERVICE_ACCOUNT_JSON(voirdocs/SETUP_CLOUDFLARE.md). - Région utilisée :
europe-west4(GOOGLE_CLOUD_LOCATION), à adapter si les modèles Gemini visés ne sont pas disponibles dans cette région.
Rappel de sécurité important¶
Le paramètre hd: 'serpe.fr' envoyé à Google est un filtre purement
côté UX : il pré-sélectionne/suggère un compte du domaine dans l'écran de
connexion Google, mais rien n'empêche techniquement un utilisateur de le
contourner (URL modifiée, compte personnel, etc.) et d'obtenir malgré tout un
token OAuth valide pour un email hors domaine.
La restriction réelle est appliquée côté base de données, par le trigger
enforce_email_domain défini dans la migration
supabase/migrations/0003_auth_config_triggers.sql :
- Il s'exécute
BEFORE INSERT(etBEFORE UPDATE OF email) surauth.users. - Il lit le domaine autorisé dans
app_config(cléallowed_email_domain, seedée àserpe.fr). - Si l'email ne se termine pas exactement par
@<domaine autorisé>, l'insertion est rejetée (raise exception) — la création du compte échoue, quel que soit ce que Google a autorisé côté OAuth.
Consultez docs/SETUP_SUPABASE.md pour vérifier/ajuster la valeur de
app_config.allowed_email_domain si le domaine réel diffère de serpe.fr.
Vérification¶
- Depuis l'application déployée (ou en local avec les variables d'env correctement renseignées), cliquez sur « Continuer avec Google ».
- Connectez-vous avec un compte
@serpe.fr: la connexion doit réussir et un profil doit être créé automatiquement dans la tableusers(triggerprovision_app_user, même migration). - Testez avec un compte hors domaine (ex. Gmail personnel) : la création du compte doit être refusée côté base — l'utilisateur ne doit pas se retrouver connecté à l'application.