Collaboration spaces Module
Ce que fait le provisioning des espaces de collaboration — et ce qu'il ne fait pas
- Cela se déclenche à l'activation du projet. Un projet standard entrant dans l'état actif provisionne un espace chez chaque fournisseur activé. Il n'y a pas de drapeau d'opt-in par projet — l'interrupteur de chaque fournisseur gouverne tous les projets standard.
- Cela maintient la composition en phase au fil des arrivées et des départs sur le projet, de façon additive par défaut. Retirer des personnes de l'espace quand elles quittent le projet est un réglage que vous activez.
- Le cycle de vie à la clôture dépend du fournisseur. Microsoft Teams archive son équipe quand le projet se termine (jamais de suppression) ; Slack, Google Chat et le Drive partagé ne s'archivent pas automatiquement (voir Supprimer / détacher).
Comment marche « Collaboration spaces »
Deux voies indépendantes mènent au même endroit. Sortante : Vaks crée lui-même l'espace via le fournisseur configuré (Teams, Slack, Google Chat). Entrante : un outil qui gère son propre espace (un canal Slack déjà possédé par votre équipe, une équipe Teams provisionnée hors Vaks, un espace Google monté par un autre système) déclare le lien en retour. Les deux voies convergent vers le même enregistrement et le même panneau sur le projet.
ProjectCollabSpace, affiché dans le panneau Collaboration spaces du projet quelle que soit la voie qui l'a créé.Les fournisseurs ne se valent pas sur tout : l'archivage à la clôture ne s'applique aujourd'hui qu'à Microsoft Teams (les canaux Slack et espaces Google Chat sont créés mais pas archivés automatiquement à la clôture d'un projet) ; la visibilité public/privé est un concept Teams et Slack que Google Chat n'a pas. Un espace déclaré depuis l'extérieur n'est jamais touché par ces règles de cycle de vie — seuls les espaces provisionnés par Vaks le sont.
Prérequis
Microsoft Teams est celui des trois qui demande le plus côté identité — le tableau ci-dessous lui est spécifique. Slack et Google Chat sont plus légers (aucune dépendance Entra/SSO) et ont chacun leur propre courte liste de prérequis dans leur section de mise en place plus bas.
| Côté | Ce qu'il vous faut |
|---|---|
| Identité | SSO ou SCIM en service, mappant l'identifiant externe à l'object ID Entra, pour que les membres du projet portent une identité Entra. C'est le prérequis dur — voir l'avertissement ci-dessus. |
| Microsoft Entra | Une inscription d'application dédiée — distincte de votre app SSO — avec des permissions applicatives Graph et le consentement administrateur. Seul un administrateur du tenant peut les accorder. |
| Vaks PM | org:manage pour le configurer. Une licence incluant le provisioning Teams. |
Étape 1 — L'inscription d'application Entra
Créez une nouvelle inscription d'application dans Centre d'administration Microsoft Entra → Identité → Applications → Inscriptions d'applications → Nouvelle inscription, mono-tenant, sans URI de redirection. Elle s'authentifie en son nom propre avec le flux client credentials — aucun utilisateur n'est impliqué.
Sous Autorisations d'API → Ajouter une autorisation → Microsoft Graph → Autorisations d'application, ajoutez :
Team.Create
TeamMember.ReadWrite.All
Channel.Create
TeamSettings.ReadWrite.All
En option, ajoutez User.Read.All pour aider à résoudre les identités. Puis pressez Accorder le consentement administrateur et vérifiez que la colonne d'état affiche Accordé pour chacune — les permissions d'application ne font rien tant qu'elles ne sont pas consenties.
Récupérez le Directory (tenant) ID et l'Application (client) ID depuis la Vue d'ensemble, et créez un secret client sous Certificats & secrets, en copiant sa valeur aussitôt.
Sites.Read.All à cette même app pour le modèle simple, ou utilisez le modèle à deux apps décrit là-bas. Vous pouvez l'ajouter maintenant ou y revenir plus tard.
.cer sous Certificates & secrets → Certificates, copier l'empreinte).
Étape 2 — Dans Vaks PM
Ouvrez Admin → Intégrations → Espaces de collaboration, choisissez Ajouter un fournisseur → Microsoft Teams, et configurez-le :
| Champ | Quoi renseigner |
|---|---|
| Tenant ID Entra | Le GUID du tenant de l'étape 1. |
| Client ID (app registration) | Le GUID de l'application. |
| Client secret ou certificat | La valeur du secret, ou l'empreinte + la clé privée si vous utilisez l'authentification par certificat (voir ci-dessus). Les deux sont chiffrés at-rest, jamais réaffichés — laissez vide en modification pour conserver ce qui est stocké. Une clé privée renseignée prend le pas sur le secret. |
| Modèle de nom d'équipe | Comment les équipes sont nommées, par ex. [PROJECT] - {{project.name}}. Variables : {{project.name}}, {{project.key}}, {{client.name}}, {{project.id}}. |
| Channels à créer | Une liste séparée par des virgules, par ex. Planning,Dev,Client. Le canal General est créé automatiquement par Teams. |
| Visibilité de l'équipe | Private ou public. Non modifiable après la création de l'équipe. |
| Qui inviter | Si la composition suit les membres directement affectés au projet, les membres des équipes affectées au projet, ou les deux. |
| Retirer à la sortie du projet | Désactivé par défaut (additif). Activé, une personne retirée du projet est retirée de l'équipe — jamais le propriétaire. |
| Archiver à la clôture | Activé par défaut. Archive l'équipe quand le projet se termine ou est archivé. |
| Activé | L'interrupteur qui permet à un espace d'être créé à l'activation du projet. |
Étape 3 — Tester, puis provisionner
Pressez Tester sur la carte du fournisseur pour confirmer que les identifiants sont acceptés par Graph.
Team.Create manquant passe le test et n'échoue qu'au premier provisioning réel. Après un test au vert, provisionnez donc un projet et regardez-le réussir avant de faire confiance à la configuration.
À partir de là, le provisioning est automatique : activez un projet standard et son équipe est créée. Le panneau Espaces de collaboration de chaque projet dispose aussi de boutons manuels — Provisionner maintenant, Re-synchroniser, Archiver — et affiche les dernières entrées du journal de provisioning avec le décompte des membres ajoutés et ignorés.
Étape 4 — Documents SharePoint pour les agents et les membres (optionnel)
Chaque équipe provisionnée a un site SharePoint derrière elle. Cette extension permet aux agents IA travaillant sur le projet — et aux membres du projet qui ont accès à l'équipe — de lire ces documents comme contexte en direct : rien n'est copié, et c'est en lecture seule. Les membres les consultent sous l'onglet SharePoint de l'espace documents du projet ; les agents y accèdent via leur contexte de travail.
Elle nécessite une permission Graph supplémentaire sur l'app, dans l'un de deux modèles :
- Read-all (plus simple) : ajoutez
Sites.Read.Allà l'app de provisioning. Un seul consentement ; Vaks PM restreint les lectures aux drives des équipes provisionnées. - Selected-sites (plus serré) : l'app de provisioning détient
Sites.FullControl.Allet accorde à une seconde app lectrice minimale un accèsSites.Selectedau site de chaque équipe au fur et à mesure du provisioning. Les lectures des agents passent par l'app lectrice, qui ne peut voir que les sites qui lui ont été accordés.
Activez-la ensuite à deux endroits — à l'échelle de l'org sous Intégrations → Collaboration spaces (dans la carte SharePoint : Enable SharePoint context, plus le modèle d'identité et, pour le modèle selected, l'ID client et le secret de l'app lectrice), et par projet (SharePoint document context, qui exige aussi que le projet ait les agents activés).
Étape 1 — L'app Slack
Slack n'a aucun prérequis d'identité — il lui faut un bot token et rien d'autre. Allez sur api.slack.com/apps → Create New App → From scratch, nommez-la (ex. Vaks PM) et choisissez le workspace où elle doit vivre.
Sous OAuth & Permissions → Scopes → Bot Token Scopes, ajoutez :
channels:manage
groups:write
users:read.email
channels:manage crée et gère les canaux publics, groups:write fait de même pour les canaux privés, et users:read.email sert à résoudre l'email d'un membre du projet vers un compte Slack pour l'inviter. Ajoutez celui des deux premiers qui correspond à la visibilité de canal que vous comptez utiliser — les deux si vous n'êtes pas encore sûr.
Remontez à OAuth Tokens et cliquez sur Install to Workspace (un admin du workspace doit approuver si vous n'en êtes pas un). Copiez le Bot User OAuth Token — il commence par xoxb-.
Étape 2 — Dans Vaks PM
Ouvrez Admin → Intégrations → Collaboration spaces, choisissez Ajouter un fournisseur → Slack, et configurez-le :
| Champ | Quoi renseigner |
|---|---|
| Bot token | La valeur xoxb-… de l'étape 1. Chiffré at-rest, jamais réaffiché — laissez vide en modification pour conserver le token stocké. |
| Préfixe du nom de canal | Préfixé au nom du projet slugifié, ex. proj- → #proj-refonte-site. |
| Visibilité du canal | Privé ou public. Nécessite le scope correspondant de l'étape 1. |
| Inviter les membres | Activé par défaut. Invite les membres du projet dans le canal, rapprochés par email — best-effort, les membres sans compte Slack correspondant sont ignorés silencieusement. |
| Activé | L'interrupteur qui permet à un canal d'être créé à l'activation du projet. |
Cliquez sur Tester pour confirmer que le token est accepté, puis activez un projet standard pour voir son canal créé — ou, pour un projet déjà actif, utilisez l'outil Provisionner maintenant directement sur la carte Slack (collez l'id du projet) plutôt que de faire un aller-retour de statut.
Étape 1 — Google Cloud & Workspace
Google Chat est le plus lourd des trois à mettre en place, car l'API Chat n'a pas de mode app-only : créer un espace et y ajouter des membres exige toujours un utilisateur Workspace réel, donc un compte de service doit l'impersonner via une délégation domain-wide. Attendez-vous à impliquer un admin Google Cloud et un admin Workspace.
- Activer l'API. Dans un projet Google Cloud (créez-en un si besoin), allez sur APIs & Services → Library, cherchez Google Chat API, et activez-la.
- Configurer l'app Chat — ne pas sauter cette étape. Activer l'API ne suffit pas : ouvrez l'onglet Configuration de la Google Chat API (
console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat) et renseignez un nom d'app, une URL d'avatar (n'importe quelle image https) et une description. Vaks ne faisant que des appels REST (jamais de bot interactif), laissez les fonctionnalités interactives désactivées (sinon Google réclame une URL de connexion inutile). Rendez l'app visible pour votre domaine. Sans cette configuration, tout appel Chat renvoie « PERMISSION_DENIED — the resource doesn't exist », même avec une délégation parfaite — c'est le piège le plus courant. - Créer un compte de service. IAM & Admin → Service Accounts → Create Service Account. Notez son email (
…@….iam.gserviceaccount.com). Deux modes d'authentification ensuite : clé de compte de service (téléchargez une clé JSON via Keys → Add Key → JSON) ou Workload Identity, sans clé (rien à télécharger — voir la section dédiée juste après, recommandée si votre organisation bloque la création de clés de compte de service). - Activer la délégation domain-wide. Toujours sur la page du compte de service, cochez Enable Google Workspace Domain-wide Delegation et notez le Client ID (un long nombre, pas l'email).
- Autoriser les scopes, dans la console admin Workspace. Dans admin.google.com (un super admin Workspace est requis ici) → Security → API controls → Domain-wide delegation → Add new : collez le Client ID numérique, et ces scopes :
https://www.googleapis.com/auth/chat.spaces,https://www.googleapis.com/auth/chat.memberships - Choisir un utilisateur à impersonner. N'importe quelle boîte Workspace réelle et licenciée convient — c'est l'identité que le compte de service emprunte pour agir comme un humain. Un compte d'exploitation/automatisation est un choix courant ; il ne peut simplement pas être le compte de service lui-même.
Sans clé — Workload Identity Federation (commun à toutes les intégrations Google)
Beaucoup d'organisations orientées sécurité appliquent la règle d'organisation Google iam.disableServiceAccountKeyCreation, qui interdit de télécharger une clé de compte de service. Dans ce cas, la méthode par clé ci-dessus est un mur. Vaks PM propose alors un second mode d'authentification, Workload Identity Federation (WIF), qui n'a besoin d'aucune clé téléchargée — c'est le chemin qu'un client Google sérieux acceptera.
Le principe : Vaks signe un jeton OIDC avec sa propre clé (dont Google ne connaît que la partie publique, collée dans la config du pool), Google l'échange contre un jeton fédéré, puis signe l'assertion de délégation domain-wide côté serveur. La clé détenue par Vaks ne donne aucun accès en soi : l'accès est gouverné par la config WIF et un droit IAM, tous deux révocables par vous à tout moment.
signJwt : activez aussi l'IAM Service Account Credentials API (iamcredentials.googleapis.com) dans le projet, en plus de l'API de l'intégration concernée (Chat ou Drive). C'est un oubli fréquent — le test échoue tant qu'elle n'est pas activée.
--workload-identity-pool=vaks reste identique partout), puis un provider par intégration que vous faites tourner en WIF — chacun avec son issuer et son JWKS.
| Intégration | Issuer émis par Vaks | Nom de provider suggéré | Où générer la clé |
|---|---|---|---|
| Google Chat | …/federation/gchat | vaks-gchat | Carte Google Chat (Collaboration spaces) |
| Google Drive — provisioning du Drive partagé | …/federation/gdrive-provisioning | vaks-gdrive-prov | Carte Google Drive (Collaboration spaces) |
| Google Drive — lecture des documents | …/federation/gdrive | vaks-gdrive-read | Carte Google Drive (Sources de documents) |
Ce cloisonnement est délibéré : chaque intégration a sa propre clé, donc vous pouvez la régénérer ou la révoquer sans casser les autres. Si vous n'utilisez qu'une seule intégration en WIF, vous n'avez évidemment qu'un seul provider à créer.
Une fois par organisation
- Cibler le projet (l'ID, en texte — pas le numéro) :
gcloud config set project PROJECT_ID - Créer le pool d'identités — une seule fois, réutilisé par toutes les intégrations :
gcloud iam workload-identity-pools create vaks --location=global --display-name="Vaks PM"
Une fois par intégration
Répétez ce bloc pour chaque ligne du tableau ci-dessus que vous activez. Toutes les commandes de cette page utilisent les mêmes marqueurs à remplacer :
| Marqueur | Valeur à mettre à la place |
|---|---|
PROJECT_ID | L'identifiant texte du projet Google Cloud (ex. mon-projet-prod). |
PROJECT_NUMBER | Le numéro du projet (que des chiffres, ex. 3110105436) — visible sur la page d'accueil de la console Cloud. Ce n'est pas le PROJECT_ID : les deux commandes ci-dessous n'attendent pas la même chose. |
SA_EMAIL | L'email du compte de service (…@….iam.gserviceaccount.com). |
PROVIDER_NAME | Le nom du provider de cette intégration (colonne « Nom de provider suggéré » du tableau ci-dessus). |
<ISSUER> | L'issuer affiché par la carte après génération de la clé — à copier-coller, jamais à retaper. |
- Compte de service sans clé. Le compte de service de l'étape 1 convient — ne créez simplement aucune clé JSON. La délégation domain-wide (Client ID + scopes en admin Workspace) reste celle de l'intégration concernée.
- Générer la clé de signature dans Vaks. Dans la carte de l'intégration, basculez Authentification sur Workload Identity (sans clé), puis Générer la clé de signature. Vaks affiche l'issuer, le kid et un JWKS public — la clé privée reste chiffrée en base, jamais exposée.
Créez le fichier dans Cloud Shell. Entre les deux
EOF, collez le contenu exact du champ « JWKS public » de la carte — le bloc{"keys":[ … ]}complet, tel quel, sans rien modifier. Ce n'est pas un contenu à inventer ni à recopier d'un exemple : c'est votre clé publique, celle qui porte lekidaffiché sur la carte. (Les guillemets autour du premierEOFempêchent le shell d'interpréter le contenu.)cat > jwks-PROVIDER_NAME.json <<'EOF' [[ COLLEZ ICI LE JWKS PUBLIC AFFICHÉ SUR LA CARTE ]] EOFLe JWKS ne contient que de la clé publique — il n'y a rien de secret à protéger dans ce fichier. Le
kidqu'il porte doit être celui affiché sur la carte : c'est lui qui permettra plus tard de vérifier que Google détient la bonne version.Alternative si vous préférez un éditeur :
cloudshell edit jwks-PROVIDER_NAME.json. Vérifiez au besoin que le fichier est du JSON valide avecpython3 -m json.tool jwks-PROVIDER_NAME.json. - Créer le provider OIDC (JWKS collé, drapeau
--jwk-json-path— pas--jwks-json-filedans les gcloud récents) :gcloud iam workload-identity-pools providers create-oidc PROVIDER_NAME \ --location=global --workload-identity-pool=vaks \ --issuer-uri="<ISSUER>" --jwk-json-path=jwks-PROVIDER_NAME.json \ --attribute-mapping="google.subject=assertion.sub" - Autoriser le pool à impersonner le compte de service. Cette liaison se fait au niveau du pool, pas du provider : elle identifie le compte de service par son sujet, sans distinguer par quel provider le jeton est arrivé. Donc si vous réutilisez le même compte de service pour plusieurs intégrations, un seul binding suffit — il n'y a rien à rejouer. À ne refaire que si l'intégration utilise un compte de service différent.
gcloud iam service-accounts add-iam-policy-binding SA_EMAIL \ --role=roles/iam.serviceAccountTokenCreator \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/vaks/subject/SA_EMAIL"Note :
SA_EMAILapparaît à deux endroits — le compte de service ciblé (juste aprèsadd-iam-policy-binding) et lesubject/du membre. Remplacez les deux par la même adresse. - Renseigner l'audience dans la carte : le nom de ressource complet du provider que vous venez de créer — il se termine par
PROVIDER_NAME, pas par le nom du pool.//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/vaks/providers/PROVIDER_NAME
kid. Tant que le JWKS resté côté Google porte l'ancien, Google ne trouve pas la clé du jeton et retombe sur la découverte OIDC — d'où l'erreur trompeuse Parsing error for OIDC discovery document, qui laisse croire à un problème d'URL alors que c'est une clé périmée. Recopiez le JWKS affiché sur la carte, puis :
gcloud iam workload-identity-pools providers update-oidc PROVIDER_NAME \
--location=global --workload-identity-pool=vaks \
--jwk-json-path=jwks-PROVIDER_NAME.json
Vérifiez ensuite que le kid stocké correspond à celui de la carte :
gcloud iam workload-identity-pools providers describe PROVIDER_NAME \
--location=global --workload-identity-pool=vaks --format="value(oidc.jwksJson)"
https://www.googleapis.com/auth/chat.spaces,https://www.googleapis.com/auth/chat.memberships,https://www.googleapis.com/auth/drive
Un compte de service dédié par intégration reste plus propre en termes de moindre privilège (chaque identité ne porte que ses scopes) — mais il exige alors son propre binding IAM.
iss du jeton émis ne correspond pas à l'issuer déclaré sur ce provider. Un provider par issuer — toujours. Le message de gcloud est explicite : ALREADY_EXISTS: Requested entity already exists si vous tentez de recréer un provider du même nom.
--jwk-json-path) : Google ne rappelle jamais votre serveur pour le récupérer. Le mode WIF fonctionne donc même en déploiement isolé.
Étape 2 — Dans Vaks PM
Ouvrez Admin → Intégrations → Collaboration spaces, choisissez Ajouter un fournisseur → Google Chat, et configurez-le. Choisissez d'abord le mode d'Authentification : Clé de compte de service (le champ clé privée apparaît) ou Workload Identity (sans clé) (le champ audience et le panneau de génération de clé apparaissent à la place) :
| Champ | Quoi renseigner |
|---|---|
| Email du compte de service | L'adresse …@….iam.gserviceaccount.com de l'étape 1. |
| Clé privée du compte de service | Collez le fichier JSON téléchargé en entier, sa seule valeur private_key, ou un PEM déjà propre — les trois formes sont acceptées et normalisées. Chiffrée at-rest, jamais réaffichée — laissez vide en modification pour conserver la clé stockée. |
| Utilisateur Workspace impersonné | L'email du dernier point de l'étape 1. |
| Préfixe du nom d'espace | Préfixé au nom du projet, ex. proj- → proj-Refonte site. Contrairement à Slack, les noms d'espace Google Chat ne sont pas slugifiés. |
| Inviter les membres | Activé par défaut. Invite les membres du projet dans l'espace, rapprochés par email — best-effort, les membres sans compte Chat sont ignorés silencieusement. |
| Activé | L'interrupteur qui permet à un espace d'être créé à l'activation du projet. |
Cliquez sur Tester — ça échange l'assertion du compte de service contre un jeton et fait un petit appel Chat API en lecture seule, confirmant que toute la chaîne de délégation fonctionne avant que quoi que ce soit ne soit créé. Puis activez un projet standard pour voir son espace apparaître.
Supprimer un espace, ou détacher un lien
Deux actions vivent sur chaque tuile de la section Collaboration spaces d'un projet, et il ne faut pas les confondre :
| Action | Effet | Disponible sur |
|---|---|---|
| Archiver | Action distante réelle et réversible : l'équipe/le canal passe en lecture seule, le contenu est conservé. | Microsoft Teams, Slack |
| Supprimer l'espace | Destructif et définitif côté Google. Chat : l'espace et ses messages disparaissent (spaces.delete) — nécessite d'ajouter le scope chat.delete à la délégation domain-wide. Drive partagé : le Drive et les fichiers qu'il contient sont supprimés. Aucun des deux n'a d'archivage — c'est le seul nettoyage distant possible. | Google Chat, Google Drive |
| Détacher le lien | Nettoyage local uniquement : retire le lien côté Vaks sans aucun appel distant. L'espace distant continue d'exister. À utiliser quand l'espace/équipe/Drive a déjà été supprimé côté fournisseur et qu'Archiver/Re-synchroniser partent en 404. Le projet repasse à « Provisionner maintenant ». | Les quatre fournisseurs |
chat.delete ? Au même endroit que les deux scopes Chat de départ : admin.google.com → Sécurité → Contrôle des API → Délégation au niveau du domaine. Modifiez la ligne existante de votre Client ID (ne recréez pas une entrée) et remplacez la liste de scopes par les trois :
https://www.googleapis.com/auth/chat.spaces,https://www.googleapis.com/auth/chat.memberships,https://www.googleapis.com/auth/chat.delete
Le mode Workload Identity ne demande aucune autre modification pour la suppression — c'est bien un scope de délégation, pas un rôle IAM. Tant que chat.delete n'est pas dans la liste, seule la suppression échoue ; la création continue.
Étape 1 — Google Cloud & Workspace
Le provisioning Google Drive crée un Drive partagé par projet — l'équivalent Google du site SharePoint qui accompagne une équipe Teams. Comme pour Google Chat, un compte de service seul ne suffit pas : créer un Drive partagé exige un utilisateur Workspace réel, donc l'impersonation par délégation domain-wide est obligatoire, quel que soit le mode d'authentification.
drive), alors que la lecture des documents reste en drive.readonly. Vous pouvez utiliser le même compte de service pour les deux, ou en dédier un à chaque rôle — c'est recommandé si vous voulez garantir que le chemin de lecture ne peut rien modifier. Côté lecture, voir Sources de documents.
- Activer l'API. Dans votre projet Google Cloud, APIs & Services → Library → Google Drive API → activer.
- Créer un compte de service. IAM & Admin → Service Accounts. Notez son email (
…@….iam.gserviceaccount.com). Deux modes d'authentification ensuite : clé de compte de service (Keys → Add Key → JSON) ou Workload Identity, sans clé. - Activer la délégation domain-wide. Sur la page du compte de service, cochez Enable Google Workspace Domain-wide Delegation et notez le Client ID (le long nombre, pas l'email).
- Autoriser le scope, en console admin Workspace. admin.google.com → Sécurité → Contrôle des API → Délégation au niveau du domaine → Ajouter : collez le Client ID numérique, et ce scope :
Ce scope couvre la création du Drive et la gestion de ses membres. Il englobe la lecture : un compte de service dédié uniquement à la lecture des documents n'a besoin, lui, que dehttps://www.googleapis.com/auth/drivedrive.readonly. - Choisir un utilisateur à impersonner. Une boîte Workspace réelle et licenciée, qui a le droit de créer des Drive partagés. Un compte d'exploitation convient bien.
Mode sans clé (Workload Identity) pour cette intégration
Le principe et le pool sont communs à toutes les intégrations Google — voir Sans clé — Workload Identity Federation pour la création du pool (à ne faire qu'une fois). Ce qui suit est le bloc propre au provisioning Drive : il lui faut son propre provider, car son issuer diffère de celui de Google Chat.
- Dans la carte Google Drive (Étape 2 ci-dessous), passez Authentification sur Workload Identity (sans clé) puis Générer la clé de signature. L'issuer affiché se termine par
/federation/gdrive-provisioning; copiez le JWKS dansjwks-gdrive-prov.json. - Créez le provider dédié, dans le pool
vaksdéjà existant :gcloud iam workload-identity-pools providers create-oidc vaks-gdrive-prov \ --location=global --workload-identity-pool=vaks \ --issuer-uri="https://VOTRE-TENANT/federation/gdrive-provisioning" \ --jwk-json-path=jwks-gdrive-prov.json \ --attribute-mapping="google.subject=assertion.sub" - Le droit d'impersonation est porté par le pool : si le compte de service est déjà lié (par exemple pour Google Chat), il n'y a rien à refaire. Sinon, rejouez le
add-iam-policy-bindingde la section commune. - Collez cette audience dans le champ Audience du pool WIF de la carte :
//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/vaks/providers/vaks-gdrive-prov
Étape 2 — Dans Vaks PM
Ouvrez Admin → Intégrations → Collaboration spaces, puis Ajouter un fournisseur → Google Drive. Choisissez d'abord le mode d'Authentification : le formulaire s'adapte (clé privée, ou audience du pool + panneau de génération de clé).
| Champ | Quoi renseigner |
|---|---|
| Email du compte de service | L'adresse …@….iam.gserviceaccount.com de l'étape 1. |
| Clé privée du compte de service (mode clé) | Le fichier JSON entier, sa seule valeur private_key, ou un PEM propre — les trois formes sont acceptées. Chiffrée at-rest, jamais réaffichée ; laissez vide en modification pour conserver la clé stockée. |
| Audience du pool WIF (mode sans clé) | Le nom de ressource complet du provider WIF, en //iam.googleapis.com/projects/…/providers/…. |
| Utilisateur Workspace impersonné | L'email du dernier point de l'étape 1. Obligatoire dans les deux modes. |
| Préfixe du nom du Drive | Préfixé au nom du projet, ex. Projet → Projet Refonte du site. |
| Rôle des membres ajoutés | Lecteur (défaut, moindre privilège — suffisant pour le contexte documentaire) ou Contributeur si l'équipe doit y déposer des fichiers. |
| Ajouter les membres du projet | Activé par défaut. Ajoute les membres du projet et des équipes affectées, rapprochés par email — best-effort, les échecs sont journalisés sans bloquer la création. |
| Activé | L'interrupteur qui autorise la création d'un Drive à l'activation d'un projet. |
Cliquez sur Tester — l'assertion est échangée contre un jeton et un petit appel Drive en lecture est effectué, ce qui valide toute la chaîne de délégation avant que quoi que ce soit ne soit créé. Activez ensuite un projet standard pour voir son Drive apparaître. Re-provisionner un projet déjà pourvu ne recrée rien : ça re-synchronise seulement les membres.
Synchronisation de la composition
La composition est maintenue à jour de trois façons : quand les membres ou managers du projet changent, quand la composition d'une équipe affectée change, et par un job de filet de sécurité qui réconcilie périodiquement chaque projet actif provisionné. La synchronisation est additive seulement, sauf si Retirer à la sortie du projet est activé, et elle ne retire jamais le propriétaire. Seuls les membres actifs ayant une identité Entra sont ajoutés ; tous les autres sont ignorés et comptés dans le journal.
Espaces déclarés depuis l'extérieur
Tout ce qui précède fait que Vaks crée l'espace (Microsoft Teams). L'autre sens existe aussi : un outil externe qui crée lui-même l'espace — un canal Slack, un espace Google, ou une équipe Teams gérée hors de Vaks — vient déclarer le lien en retour, pour qu'il s'affiche sur le projet. Aucune licence de provisioning Teams n'est requise pour cette voie.
Elle s'appuie sur une clé d'organisation restreinte au seul périmètre collab:link — volontairement étroit : cette clé ne peut rien lire ni modifier d'autre sur le projet. Créez-la depuis Admin → Intégrations → Collaboration spaces : ajoutez le fournisseur Declared spaces API, qui frappe une clé scopée collab:link (le secret n'est affiché qu'une fois).
| Méthode & route | Rôle |
|---|---|
PUT /api/v1/projects/{projectId}/collab-spaces/{provider} | Déclarer ou mettre à jour un espace. Idempotent sur (projet, fournisseur). Refuse (409) d'écraser un espace provisionné par Vaks. |
GET /api/v1/projects/{projectId}/collab-spaces | Lister les espaces liés au projet. |
DELETE /api/v1/projects/{projectId}/collab-spaces/{provider} | Retirer un lien déclaré (liens externes uniquement). |
{provider} est une étiquette libre (slack, google, teams…). Le corps du PUT :
{
"url": "https://…", // requis, https obligatoire, ≤ 2048 car.
"externalId": "C0123ABCD", // optionnel — l'id de l'espace côté outil
"name": "Projet Acme" // optionnel — libellé affiché
}
project.activated : votre outil sait ainsi quand créer l'espace, puis le déclare en retour par le PUT ci-dessus.
Dépannage
Le provisioning est délibérément silencieux — il ne casse jamais une mise à jour de projet — c'est donc le panneau Espaces de collaboration du projet et son journal qu'il faut regarder. Les messages serveur reviennent en français quelle que soit la langue de l'interface, reproduits mot pour mot ci-dessous.
| Symptôme | Cause & correctif |
|---|---|
| Le provisioning échoue, chaque membre est ignoré | Aucun membre n'a d'identité Entra : aucun propriétaire ne peut donc être désigné. Le SSO ou SCIM doit être en service et mapper vers l'object ID Entra. C'est la cause numéro un. |
| Le test est au vert mais le premier provisioning échoue | Le test ne vérifie pas les permissions Teams. Vérifiez que les quatre permissions Graph sont ajoutées et consenties. |
| Le provisioning Microsoft Teams requiert une licence active. | La licence n'inclut pas le provisioning Teams. Importez-en une sous Admin → Organisation → Licence. |
| Configuration Graph incomplète (tenantId / clientId). | Un champ obligatoire est vide. Complétez la carte du fournisseur. |
| Échec d'obtention du token Graph: … | Le Tenant ID, le client ID ou le secret est erroné, ou le secret a expiré. Le texte qui suit est la raison propre de Microsoft. |
| Provisioning indisponible sur un projet externe | Attendu — les conteneurs de tickets externes n'obtiennent jamais d'équipe. |
| Les membres échouent brièvement à s'ajouter après la création | Délai de propagation Entra après la création asynchrone de l'équipe. Le système réessaie ; cela se résout tout seul. |
| Les agents ne peuvent pas lire SharePoint | Vérifiez, dans l'ordre : la bascule org, la bascule projet, que le projet a les agents activés, que l'équipe est provisionnée, et que le grant s'affiche comme accordé (utilisez Verify access). |
| invalid_auth / not_authed (Slack) | Le bot token est erroné, révoqué, ou l'app a été désinstallée du workspace. Réinstallez et collez le nouveau token. |
| missing_scope (Slack) | Un Bot Token Scope requis manque. Ajoutez-le sous OAuth & Permissions et réinstallez l'app — ajouter le scope seul ne suffit pas. |
| name_taken (Slack) | Un canal portant exactement ce nom existe déjà. Vaks PM ne devine pas son ID de façon fiable, donc ça remonte comme un échec de provisioning plutôt que d'adopter silencieusement le canal existant. |
| Le test échoue avec une erreur d'autorisation/consentement (Google Chat) | La délégation domain-wide manque, a les mauvais scopes, ou ne s'est pas encore propagée (rarement jusqu'à 24h). Revérifiez le Client ID et les deux scopes dans la console admin Workspace, puis réessayez. |
| Clé privée invalide (Google Chat) | La valeur collée n'est pas reconnue comme une clé privée PKCS#8. Vaks PM accepte le JSON téléchargé en entier, le champ brut private_key, ou un PEM propre — mais il doit finalement contenir un bloc -----BEGIN PRIVATE KEY-----. |
| PERMISSION_DENIED / « the resource doesn't exist » (Google Chat) | Dans l'ordre de fréquence : (1) l'app Chat n'est pas configurée — activer l'API ne suffit pas, il faut remplir l'onglet Configuration (nom/avatar/description) ; (2) le service Google Chat n'est pas activé pour l'org ; (3) l'utilisateur impersonné n'est pas une boîte Workspace réelle, active et licenciée ; (4) délégation pas encore propagée (réessayez après quelques minutes). |
| Parsing error for OIDC discovery document: Unexpected end of stream : expected '{' (WIF) | Le provider n'a pas de JWKS attaché. Avec un JWKS collé en ligne, Google ne va jamais chercher de document de découverte : si vous voyez cette erreur, c'est qu'il tente de lire <issuer>/.well-known/openid-configuration — une route que Vaks ne sert pas, d'où la réponse non-JSON. Causes typiques : le provider a été créé sans --jwk-json-path, ou le fichier jwks-<provider>.json était vide/introuvable au moment du create-oidc. Vérifiez avec providers describe … --format="yaml(oidc)" que jwksJson est bien renseigné, puis corrigez avec providers update-oidc … --jwk-json-path=jwks-<provider>.json. |
| Google STS : jeton fédéré absent (WIF) | L'audience du pool ne correspond pas, ou le mapping d'attribut du provider est faux. Vérifiez l'Audience du pool (le //iam.googleapis.com/…/providers/… exact) et l'issuer déclaré. |
| Google signJwt : signedJwt absent (WIF) | Le droit roles/iam.serviceAccountTokenCreator manque sur le compte de service pour le principal du pool, ou l'IAM Service Account Credentials API n'est pas activée. |
| Suppression d'espace refusée (Google Chat) | Le scope chat.delete n'est pas dans la délégation domain-wide. Ajoutez-le aux scopes autorisés en admin Workspace — la création n'en a pas besoin, seule la suppression. |
À lire aussi : sources de documents, le guide complet de SharePoint et Google Drive comme contexte de lecture · SCIM et OIDC, prérequis du lien d'identité Entra · connecteur IA pour les agents qui lisent le contexte SharePoint · toutes les intégrations.