Collaboration spaces Module

Vaks PM · Guide d'intégration · Microsoft Teams · Slack · Google Chat · Juillet 2026

Trois fournisseurs sous le même toit. Admin → Intégrations → Collaboration spaces propose Microsoft Teams, Slack et Google Chat en self-service — même déclencheur (un projet qui devient actif), même idempotence, même panneau par projet, chacun configuré indépendamment dans sa propre carte. Ce guide couvre les trois de bout en bout, plus la voie entrante pour les espaces qu'un outil externe gère lui-même. Teams est celui qui demande le plus (prérequis d'identité, SharePoint) ; Slack est le plus léger.
Ce que vous obtiendrez (Microsoft Teams). Une équipe Microsoft Teams créée automatiquement quand un projet devient actif, ses canaux mis en place, et sa composition maintenue en phase avec le projet. En option, les documents SharePoint de l'équipe deviennent un contexte lisible, pour les agents IA comme pour les membres du projet.
Mettez en place l'authentification unique ou SCIM d'abord — cela en dépend. Créer une équipe requiert un propriétaire, et Vaks PM ne peut en désigner un qu'à partir d'un membre dont le compte est lié à une identité Entra. Ce lien est renseigné par la création juste-à-temps du SSO ou par SCIM. Si aucun membre du projet n'a d'identité Entra, le provisioning échoue purement et simplement, les comptes locaux étant silencieusement ignorés. Faites fonctionner OIDC ou SCIM avant de compter sur ceci — et assurez-vous que l'identifiant externe correspond bien à l'object ID Entra.

Ce que fait le provisioning des espaces de collaboration — et ce qu'il ne fait pas

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.

Projet passe ACTIVE transition serveur, les deux voies peuvent suivre Projet clôturé/archivé Équipe archivée (Teams seulement) SORTANTE · VAKS CRÉE L'ESPACE Microsoft Teams Slack Google Chat Crée l'espace + invite les membres rapprochés par email aux membres du projet ENTRANTE · UN OUTIL EXTERNE LE DÉCLARE L'outil externe crée son propre espace Canal Slack · Espace Google · Teams hors Vaks PUT …/collab-spaces/:provider clé org scopée collab:link, rien de plus Ligne ProjectCollabSpace créée provider · url · source : provisioned ou external Affiché dans le panneau du projet
Sortante (Vaks provisionne) et entrante (un outil externe déclare) aboutissent toutes deux au même enregistrement 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 EntraUne 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 PMorg: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.

L'extension SharePoint-pour-agents nécessite une ou deux permissions de plus. Si vous prévoyez de l'activer (étape 4), ajoutez 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.
Alternative sans secret. Au lieu d'un secret client, cette application peut s'authentifier par certificat (private_key_jwt) — voir la procédure détaillée dans le guide SSO OIDC, qui s'applique à l'identique ici (générer la paire clé/certificat, uploader le .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 :

ChampQuoi renseigner
Tenant ID EntraLe GUID du tenant de l'étape 1.
Client ID (app registration)Le GUID de l'application.
Client secret ou certificatLa 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'équipeComment les équipes sont nommées, par ex. [PROJECT] - {{project.name}}. Variables : {{project.name}}, {{project.key}}, {{client.name}}, {{project.id}}.
Channels à créerUne liste séparée par des virgules, par ex. Planning,Dev,Client. Le canal General est créé automatiquement par Teams.
Visibilité de l'équipePrivate ou public. Non modifiable après la création de l'équipe.
Qui inviterSi 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 projetDé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ôtureActivé 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.

Le test est délibérément superficiel. Il confirme que le jeton est accepté, mais ne vérifie pas les permissions Teams — un 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.

La création de l'équipe est asynchrone. Microsoft crée l'équipe en arrière-plan : les canaux et les membres apparaissent donc un instant plus tard, et un ajout de membre immédiat peut brièvement échouer pendant qu'Entra propage — le système réessaie. Un membre sans identité Entra est ignoré et compté, ce n'est pas une erreur.

É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 :

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).

L'accès est vérifié, pas supposé. Quand une équipe est provisionnée, Vaks PM résout son site et son drive et enregistre si le grant est en place. Si ce n'est pas le cas, le panneau Espaces de collaboration du projet dispose d'un bouton Verify access pour re-vérifier. Agents comme membres ne peuvent lire qu'une fois le grant affiché comme accordé et le drive résolu.

É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/appsCreate New AppFrom 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-.

Un scope ajouté après l'installation ? Slack ne l'applique pas rétroactivement. Réinstallez l'app depuis la même page OAuth & Permissions ; le token reste le même mais ne prend en compte le nouveau scope qu'à partir de là.

Étape 2 — Dans Vaks PM

Ouvrez Admin → Intégrations → Collaboration spaces, choisissez Ajouter un fournisseur → Slack, et configurez-le :

ChampQuoi renseigner
Bot tokenLa 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 canalPréfixé au nom du projet slugifié, ex. proj-#proj-refonte-site.
Visibilité du canalPrivé ou public. Nécessite le scope correspondant de l'étape 1.
Inviter les membresActivé 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.

  1. 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.
  2. 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.
  3. 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).
  4. 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).
  5. 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
  6. 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.
La délégation peut mettre du temps à se propager. Généralement c'est quasi-instantané ; la documentation Google elle-même prévoit jusqu'à 24 heures dans de rares cas. Si le test ci-dessous échoue juste après avoir accordé les scopes avec une erreur d'autorisation, attendez quelques minutes et réessayez avant de conclure que la configuration est fausse.

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.

Prérequis d'API. Le mode WIF utilise 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.
Le pool se crée une fois ; le provider, une fois par intégration. Vaks émet un issuer différent pour chaque intégration Google, et un provider OIDC Google ne peut être lié qu'à un seul issuer. Vous créez donc le pool une seule fois pour toute l'organisation (--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égrationIssuer émis par VaksNom de provider suggéréOù générer la clé
Google Chat…/federation/gchatvaks-gchatCarte Google Chat (Collaboration spaces)
Google Drive — provisioning du Drive partagé…/federation/gdrive-provisioningvaks-gdrive-provCarte Google Drive (Collaboration spaces)
Google Drive — lecture des documents…/federation/gdrivevaks-gdrive-readCarte 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

  1. Cibler le projet (l'ID, en texte — pas le numéro) :
    gcloud config set project PROJECT_ID
  2. 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 :

MarqueurValeur à mettre à la place
PROJECT_IDL'identifiant texte du projet Google Cloud (ex. mon-projet-prod).
PROJECT_NUMBERLe 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_EMAILL'email du compte de service (…@….iam.gserviceaccount.com).
PROVIDER_NAMELe 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.
  1. 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.
  2. 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 le kid affiché sur la carte. (Les guillemets autour du premier EOF empêchent le shell d'interpréter le contenu.)

    cat > jwks-PROVIDER_NAME.json <<'EOF'
    [[ COLLEZ ICI LE JWKS PUBLIC AFFICHÉ SUR LA CARTE ]]
    EOF

    Le JWKS ne contient que de la clé publique — il n'y a rien de secret à protéger dans ce fichier. Le kid qu'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 avec python3 -m json.tool jwks-PROVIDER_NAME.json.

  3. Créer le provider OIDC (JWKS collé, drapeau --jwk-json-path — pas --jwks-json-file dans 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"
  4. 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_EMAIL apparaît à deux endroits — le compte de service ciblé (juste après add-iam-policy-binding) et le subject/ du membre. Remplacez les deux par la même adresse.

  5. 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
Si vous régénérez la clé, vous DEVEZ re-uploader le JWKS. Chaque génération produit un nouveau 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)"
Réutiliser le même compte de service pour plusieurs intégrations ? Oui, c'est le cas le plus simple — et il n'y a alors ni binding IAM ni compte à recréer. Une seule chose à ajuster : la délégation domain-wide doit lister l'union des scopes. Dans admin.google.comSécurité → Contrôle des API → Délégation au niveau du domaine, modifiez la ligne existante de votre Client ID (n'en créez pas une seconde) et mettez-y tous les scopes utiles, par exemple pour Chat + Drive :
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.
Erreur la plus courante quand on ajoute une 2ᵉ intégration. Réutiliser le provider de la première (donc son audience) : l'échange STS échoue, car l'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.
Air-gap. Le JWKS est collé dans la config du provider (option --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) :

ChampQuoi renseigner
Email du compte de serviceL'adresse …@….iam.gserviceaccount.com de l'étape 1.
Clé privée du compte de serviceCollez 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'espacePré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 membresActivé 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 :

ActionEffetDisponible sur
ArchiverAction distante réelle et réversible : l'équipe/le canal passe en lecture seule, le contenu est conservé.Microsoft Teams, Slack
Supprimer l'espaceDestructif 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 lienNettoyage 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
Où accorder le scope chat.delete ? Au même endroit que les deux scopes Chat de départ : admin.google.comSé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.

Deux identités, volontairement séparées. Ce provisioning écrit (scope 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.
  1. Activer l'API. Dans votre projet Google Cloud, APIs & Services → LibraryGoogle Drive API → activer.
  2. 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é.
  3. 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).
  4. Autoriser le scope, en console admin Workspace. admin.google.comSécurité → Contrôle des API → Délégation au niveau du domaine → Ajouter : collez le Client ID numérique, et ce scope :
    https://www.googleapis.com/auth/drive
    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 de drive.readonly.
  5. 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.
Le paramètre Workspace qui bloque tout. Si la création de Drive partagés est désactivée pour l'unité organisationnelle de l'utilisateur impersonné (Admin → Applications → Google Workspace → Drive et Docs → Paramètres de partage), la création échoue quelle que soit la qualité de la délégation. C'est le premier réflexe à avoir si le test passe mais que le provisioning échoue.

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.

  1. 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 dans jwks-gdrive-prov.json.
  2. Créez le provider dédié, dans le pool vaks dé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"
  3. 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-binding de la section commune.
  4. 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é).

ChampQuoi renseigner
Email du compte de serviceL'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 DrivePréfixé au nom du projet, ex. Projet Projet Refonte du site.
Rôle des membres ajoutésLecteur (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 projetActivé 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.

Ce que ça change pour la lecture des documents. Dès qu'un projet a son Drive partagé, la source de documents Google Drive lit ce Drive pour ce projet, au lieu du dossier racine commun à l'organisation. Le dossier racine du connecteur ne sert plus que de repli, pour les projets sans Drive dédié — on retrouve exactement le comportement de SharePoint, où chaque projet lit le drive de son équipe.

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 & routeRô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-spacesLister 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é
}
Quand déclarer ? Abonnez un webhook à l'événement 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ômeCause & 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 échoueLe 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 externeAttendu — les conteneurs de tickets externes n'obtiennent jamais d'équipe.
Les membres échouent brièvement à s'ajouter après la créationDé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 SharePointVé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.