Un RBAC pour tout le vibe coding interne : vos groupes Google comme source de vérité
Depuis quelques mois, le nombre d’applications internes à chaque entreprise a augmenté de manière exponentielle, l’impulsion étant le vibe coding évidemment. Pour cadrer cette démarche, nous décrivions qu’une charte structurant l’approche est un bon point de départ. Pour autant permettre le vibe coding à l’échelle en entreprise doit aller plus loin. L’élément logique qui vient ensuite est l’authentificaiton et les droits d’accès. C’est le point d’entrée de toutes les applications vibe codées à usage interne.
Le but est de répondre au besoin : qui a le droit d’y accéder, et pour y faire quoi ?. Les approches naïves que l’on constate sur les applications vibe codées sont par exemple :
- une liste d’e-mails admins codée en dur.
- une autre coche un booléen
is_adminen base. - une troisième laisse entrer tout le monde parce que « c’est interne, de toute façon ».
Chaque application re-invente la roue (de l’autorisation) , avec plus ou moins d’élégance et surtout dans son coin. La bonne approche est évidente : l’autorisation ne doit pas appartenir à chaque application. Elle doit venir d’une source de vérité unique, que vous possédez bien souvent déjà, par exemple vos groupes Google Workspace. Dans un souci de simplicité pour le reste de l’article, nous partirons du principe que c’est en tous cas Google Workspace que vous utilisez, néanmoins l’approche reste valable pour tout autre fournisseur d’identité d’entreprise, tel que Microsoft 365 ou Okta.
J’échangeais récemment avec Maxence Bruyas, CEO de Forest Admin, sur exactement ce sujet : eux aussi centralisent l’autorisation plutôt que de la disperser — avec, créditons-les, un cran d’avance dont nous reparlerons. Quoi qu’il en soit le constat est partagé : le sujet de l’autorisation est primordial aujourd’hui.
Authentification vs Autorisation : clarifier les concepts
Deux questions se cachent derrière « la connexion ». On les confond souvent, et c’est là que naît le désordre.
L’authentification répond à « qui es-tu ? ». Sur ce point, la plupart des apps internes vibe codées adoptent souvent le bon reflexe : elles délèguent à Google OAuth, restreint au domaine de l’entreprise.
L’autorisation répond à « qu’as-tu le droit de faire ? ». Là, chacun bricole. Malheureusement, c’est la partie qui engage : un droit d’écriture mal placé et vous avez un incident. Le RBAC — Role-Based Access Control — consiste à ne pas attribuer des droits individu par individu, mais à ranger les gens dans des rôles (admin, modérateur, lecteur) et à attacher les droits aux rôles. En entreprise il est souvent plus simple de raisonner en terme d’équipes et/ou fonctions plutôt que d’individus. Ainsi on pourra par exemple donner les droits d’administration à l’équipe direction et les droits de lecture à l’équipe support.
La tentation, quand on structure un RBAC, est de construire une base de rôles et une interface pour les gérer. C’est un projet en soi, avec sa propre dette et nécessité de maintenance. Sauf que pour beaucoup d’entreprises, cette source de vérité existe déjà dans votre organisation : ce sont vos groupes Google Workspace.
Ils ont trois propriétés qu’aucune table roles maison n’aura jamais :
- Ils sont déjà tenus à jour. Les groupes servent aux mailing-lists, au partage Drive, aux agendas. Ils vivent au rythme des arrivées et des départs, souvent pilotés par les RH ou l’office management. Le cycle de vie est déjà là.
- Ils sont uniques et transverses. Un seul endroit décrit qui est dans l’équipe ops, qui est manager, qui est dans le pôle data. Pas une copie par application.
- L’offboarding devient trivial. Retirer quelqu’un d’un groupe Google le sort, d’un coup, de toutes les apps qui s’appuient dessus. Fini la chasse aux accès résiduels.
Le principe est donc : on ne crée pas une nouvelle source de vérité, on branche les apps sur celle qui existe.
Notre implémentation : un service d’identité unique
Reste un problème pratique : interroger l’API Google Directory depuis chaque application, c’est distribuer des credentials sensibles partout, gérer des quotas, et retomber dans le travers du « chacun sa cuisine ». Nous avons donc posé, chez Dernier Cri, une brique unique : identity.derniercri.io.
Son rôle est volontairement minuscule. Il ne remplace pas l’authentification : chaque app garde son propre Google OAuth. Il ne fait qu’une chose — répondre à la question « à quels groupes appartient cet e-mail ? ». Une seule responsabilité, une seule brique à sécuriser, une seule source à interroger.
À ce stade, une objection pourrait être : pourquoi ne pas déployer un Keycloak ? Parce que nous n’avons pas de problème d’authentification à résoudre — Google le fait déjà — mais un problème de résolution de groupes. Keycloak est un serveur d’identité complet, taillé pour être la source de vérité : il faudrait soit y synchroniser Google Workspace via un connecteur à maintenir, soit y recréer les groupes à la main. Dans les deux cas, on introduit une seconde source de vérité et l’offboarding cesse d’être trivial. Sans compter le serveur à déployer, patcher et sauvegarder, pour un besoin qui tient en un appel HTTP. Keycloak reste pertinent le jour où l’on doit fédérer plusieurs fournisseurs d’identité ou ouvrir l’accès à des partenaires externes — ce n’est pas notre cas ici, avec un seul domaine Google et des apps internes.
Le contrat, en deux appels
L’API tient sur presque rien, et c’est voulu. Une application s’y authentifie avec une clé app dédiée (fournie par l’équipe ops), passée en Authorization: Bearer — jamais exposée côté navigateur. Deux endpoints suffisent.
Lister les groupes configurés, pour savoir sur quoi on peut s’appuyer :
GET /v1/groups → { "groups": [ { "slug": "ops", "label": "Ops" }, { "slug": "data", "label": "Data" } ] }
Et résoudre les groupes d’un utilisateur :
POST /v1/users/groups { "email": "user@derniercri.io" } → { "email": "user@derniercri.io", "groups": ["ops"] }
C’est tout. Le service renvoie des groupes, pas des rôles. Un 400 si l’e-mail est hors du domaine autorisé, un 401 si la clé est invalide, un 429 en cas d’abus, un 502 si le lookup Google échoue. Cette pauvreté apparente est une qualité : le service reste une brique bête et fiable, sur laquelle on peut tout empiler.
La règle d’or : le service donne des groupes, l’app possède ses rôles
C’est le point qui évite de recréer un monolithe d’autorisation. Le service d’identité ne connaît que les groupes Google. La traduction en rôles applicatifs vit dans chaque application, localement.
Concrètement, un back-office décide chez lui que le groupe ops ouvre le rôle admin, et que data ouvre un accès en lecture. L’app d’à côté fera un mapping différent à partir des mêmes groupes. Le pattern tient en quelques lignes :
const ROLE_GROUPS = { admin: ['ops'], member: ['data'],};const hasRole = (userGroups, role) => ROLE_GROUPS[role].some(g => userGroups.includes(g));
C’est une manière de faire très simple mais avant-tout pragmatique : la vérité sur “qui est qui” est centralisée ; la politique “qui peut quoi” reste au plus près du métier de chaque app. On ne demande jamais au service d’identité d’arbitrer une règle applicative — il ne saurait pas, et ce n’est pas son rôle.
C’est ici que se situe le cran d’avance de Forest Admin, évoqué en introduction. Dans notre approche, le contrôle s’applique au niveau de chaque application : c’est elle qui, à partir des groupes, décide quoi autoriser. C’est simple et robuste, mais cela suppose que chaque app fasse correctement son travail de vérification. Maxence Bruyas me décrivait leur pari inverse : appliquer la couche de RBAC directement au niveau de la source des données. L’avantage est réel — la règle ne dépend plus de la discipline de chaque client, elle est garantie au plus près de la donnée, quelle que soit l’app, l’agent ou le script qui l’interroge. C’est plus exigeant à mettre en place, mais c’est la barrière la plus difficile à contourner. Les deux logiques ne s’opposent pas : une source de vérité unique pour l’identité d’un côté, un point d’application le plus bas possible de l’autre — et l’idéal combine les deux.
Les non négociables
Un RBAC mal branché est dangereux et constitue une faille de sécurité. Nous avons donc posé, comme dans la charte, des lignes rouges — non négociables :
- La clé app reste côté serveur. Jamais dans un front, jamais dans une app mobile. Une clé dans le navigateur, c’est la porte ouverte à toute l’API d’annuaire.
- On n’interroge que l’e-mail de la session serveur. Jamais un e-mail fourni par le client sans validation : sinon n’importe qui demande les droits de n’importe qui.
- L’autorisation est vérifiée côté serveur, sur chaque route protégée. Un contrôle côté client n’est qu’un confort d’affichage, jamais une barrière.
- On ne cache pas les groupes côté client au-delà de quelques minutes. Un accès révoqué doit s’éteindre vite ; des droits mis en cache trop longtemps sont un accès fantôme.
Ces règles ne sont pas de la paperasse : ce sont exactement les réflexes de moindre privilège que nous demandons à un humain comme à un agent lorsqu’il vibe code.
Et les agents dans tout ça
Ce RBAC n’est pas qu’une affaire d’humains. Nous l’avons dit à propos du platform engineering à l’ère des agents : l’IA est un acteur du système de permissions comme les autres. Un agent qui agit via un MCP branché sur vos apps internes doit, lui aussi, se voir attribuer une identité et un périmètre — pas les droits d’un super-admin par défaut.
Le même socle sert alors des deux côtés : les scripts et systèmes automatisés interrogent l’identité avec leur propre clé et un accès en lecture seule ; les actions humaines qui engagent des droits passent par un OAuth où l’on sait toujours qui agit vraiment.
Changer de réflexe
Le vibe coding va continuer de multiplier les apps internes. C’est une bonne nouvelle : on n’a jamais construit aussi vite. Mais chaque nouvel outil pose la même question d’accès, et y répondre à la main, app par app, c’est reconstituer patiemment le chaos qu’on cherchait à éviter. L’urbanisation des systèmes d’informations est à nouveau un sujet d’actualité et cette couche, centrale, en fait dorénavant partie intégrante.
Vous avez un
produit en tête ?
Construisons-le ensemble.

