Comptes de services : une clé API limitée à certains documents/dossiers/organisations

Présentation des comptes de services

Les comptes de service seront enfin disponibles de manière fonctionnelle
dans la 1.7.7 qui doit sortir aujourd’hui.

À quoi ça sert ?

À ce jour lorsque vous avez besoin de faire des actions via l’API,
par exemple pour faire une automation avec un outil externe comme n8n
vous devez activer votre clé d’API dans la page de gestion de votre utilisateur.

Inconvénient, si votre clé d’API venait à « fuir » dans la nature alors tous les
documents, espaces d’équipes et organisation dont vous êtes membres deviendraient vulnérables à la fuite d’informations.

Les comptes de service viennent pour palier à ce problème.

Ils vous permettent de créer un utilisateur de type « service » qui vous appartient.
Vous pouvez l’ajouter à vos documents, organisations ou espaces d’équipe comme
n’importe quel utilisateur, avec les mêmes règles avancées afin de restreindre ses droit sur le document.

Utilisation via la console API

Vous pouvez utiliser les service accounts directement depuis la console API (depuis un document, Paramètres > Console API), dans la section « service accounts ».

Cliquez sur « POST /service-accounts » , puis le bouton « Try it out »


Vous pouvez définir une date d’expiration pour la clé API dans le paramètre expiresAt

Cliquez sur le bouton « Execute ».

Vous pourrez voir dans la section « Réponse » :

  • key : la clé d’API à stocker (elle n’est fournie qu’une seule fois par l’API, en cas de perte il faudra en regénérer une autre)
  • login : l’adresse email en .invalid qui permet d’inviter le compte de service sur un document, un dossier ou un espace d’équipe (via le bouton de partage du doument) et de lui octroyer un rôle (propriétaire, éditeur, lecture seule, …)"

Utilisation avec curl

Attention : À ce jour les comptes de service ne sont accessible que via l’API.
Une interface graphique viendra dans les prochains mois.
Ils ne sont disponible que si votre administrateur système a ajouté la variable GRIST_ENABLE_SERVICE_ACCOUNTS sur le serveur Grist.

L’exemple est fait dans un terminal avec l’outil curl.
Mais vous pouvez bien sûr faire ça avec votre générateur de requêtes préféré (postman, n8n…).

Création d’une clé d’API

$ curl -X GET "https://grist.example/api/service-accounts"" \
-H "Authorization: Bearer ${VOTRE_CLE_D_API}" \
-H "Content-Type: application/json"

[]

Nous n’avons pas de compte de service pour l’instant

curl -X POST "https://grist.example/api/service-accounts" \
-H "Authorization: Bearer ${VOTRE_CLE_D_API}" \
-H "Content-Type: application/json" \
-d '{"label":"Nom du service", "description":"pour le tutoriel", "expiresAt":"2026-10-10"}'

{
  "id": 42,
  "login": "e3a9d3ef-1cea-42a4-8c91-b13d07568fbe@serviceaccounts.invalid",
  "key": "012345678910111213141516171819",
  "label": "Nom du service",
  "description": "pour le tutoriel",
  "expiresAt": "2026-10-10T00:00:00.000Z",
  "hasValidKey": true
}

Attention: Sauvegardez bien la clé key celle-ci ne vous sera affichée que lors de la création du compte de service.

Le login est le compte mail que vous devez renseigner pour inviter le compte de service à une ressource.

L’id est ce qui vous permettra de manipuler le compte de service via l’API.

Ajout du compte de service à un document

Vous pouvez l’ajouter comme n’importe quel utilisateur sur un document.

:eyes: Et privilégiez le moindre accès pour renforcer la sécurité. Dans l’exemple qui suit, nous n’avons besoin que de consulter les données du document, donc nous définissons un accès en lecture seule :

Vérifier que l’on a accès aux données document

curl -X GET "https://grist.example/api/docs/A1B2C34567890/tables/Mes_messages/records" \
-H "Authorization: Bearer 012345678910111213141516171819" \
-H "Content-Type: application/json" \

{
  "records": [
    {
      "id": 1,
      "fields": {
        "texte": "Bonjour la suite",
        "cacher_aux_robots": false
      }
    },
    {
      "id": 2,
      "fields": {
        "texte": "Comment ça va ?",
        "cacher_aux_robots": false
      }
    },
    {
      "id": 3,
      "fields": {
        "texte": "Ce message est reservé aux humains",
        "cacher_aux_robots": false
      }
    }
  ]
}

Changer les accès et vérifier ce que l’on voit

On a une règle ACL qui nous permet de choisir à quelles lignes on donne accès.

Si on coche certaines lignes elles seront masquées au compte de service

Et si on liste de nouveau ce que l’on voit il ne reste que ce que l’on souhaite.

{
  "records": [
    {
      "id": 1,
      "fields": {
        "texte": "Bonjour la suite",
        "cacher_aux_robots": false
      }
    }
  ]
}

Révoquer la clé d’API du compte de service

On peut révoquer la clé

curl -X DELETE "https://grist.example/api/service-accounts/42/apikey" \
-H "Authorization: Bearer ${VOTRE_CLE_D_API}" \
-H "Content-Type: application/json"

Supprimer le compte de service

Mais aussi le supprimer si on le souhaite

curl -X DELETE "https://grist.example/api/service-accounts/42" \
-H "Authorization: Bearer ${VOTRE_CLE_D_API}" \
-H "Content-Type: application/json"

En conclusion

La totalité de l’API des comptes est documentée dans le centre d’aide de Grist. Et également disponible via la console API.

4 « J'aime »

Très interessant merci.

Je viens de tester, ça fonctionne à merveille :slight_smile: merci pour le tuto @hexaltation !

Super tuto Greg, merci !

1 « J'aime »

Voici aussi une documentation qui vient compléter :
Docs Grist : Compte de service

Avec sa simplification :
:bulb:L’idée en gros

Merci beaucoup @Tsanson :slight_smile:

Hello @Tsanson merci beaucoup pour cette doc. Est-ce que je peux te faire une proposition (dans un nouveau doc), pour ajouter le fait qu’il est possible d’utiliser la console API, qui est directement accessible depuis un document et fournit une interface graphique pour créer un compte de service en 2 clics (plus facile/accessible qu’ouvrir un terminal et faire l’appel curl) ?

Je peux ajouter l’info sur la console API également dans la partie « Démonstration API » Docs

Pour info je vais commencer la relecture/généralisation de la doc « Communauté Grist », comme nous en avions discuté avec @Mathieu et Sébastien. Je fais ça sur une copie comme ça je vous le soumettrai ensuite pour validation !

A très vite et merci encore pour tout ton travail sur n8n pour le MEN :heart:

Carrément !

(blabla pour les 20 caractères minimum)

Bonjour à toutes et à tous,

Je commence à utiliser les comptes de service dans Grist, mais je me heurte à une question de gouvernance et de traçabilité. D’après mes tests et la documentation, un compte de service reste lié à son créateur·rice (le·a « propriétaire »), qui est le·a seul·e à pouvoir l’administrer ou accéder à ses informations via l’API. Si j’ai bien compris, cela implique que :

  • Seule la personne ayant créé le compte peut consulter ses métadonnées (date d’expiration, identifiant, etc.) via l’API https://grist.example/api/service-accounts/{saId}.
  • Pour utiliser cette API, il faut déjà connaître l’id du compte, ce qui suppose d’être le·a propriétaire.

Contexte : Dans mon cas, je dispose des identifiants (login + key) d’un compte de service qui m’ont été transmis (ou préconfigurés dans des outils comme n8n ou GitLab). Deux scénarios me préoccupent particulièrement :

  1. Cas d’un compte expiré ou compromis :
  • Comment identifier le·a propriétaire d’un compte de service à partir des seuls identifiants (login + key) ?
  • Comment connaître la date d’expiration de la clé associée ?
  • En l’absence de traçabilité, je crains qu’à terme, des comptes créés il y a plusieurs mois ou années ne deviennent « orphelins » (plus personne ne sait qui les a créés, ni comment les renouveler ou les révoquer). Quelle est la procédure recommandée dans ce cas ?
  1. Automatisation du suivi :
  • Pour anticiper les expirations (comme on le fait pour les certificats SSL), il faudrait pouvoir interroger l’état d’un compte de service de manière automatisée. Or, seule la personne propriétaire peut accéder à l’API /service-accounts/{saId}.
  • Cela signifie que seul·e le·a propriétaire peut surveiller ses propres comptes, ce qui limite fortement la possibilité de centraliser ou d’industrialiser ce suivi.

Proposition d’amélioration : Pour une gestion pérenne et collaborative des comptes de service, il me semble essentiel de pouvoir accéder, depuis un compte de service lui-même, à une API du type /service-account/ (sans s ni {saId}), qui retournerait au minimum les informations suivantes :

  • id (identifiant unique du compte)
  • login
  • key (ou au moins sa date d’expiration)
  • label et description
  • expiresAt (date d’expiration de la clé)
  • owner (informations sur le·a propriétaire, au moins un email de contact)

Cela permettrait de :

  • Retrouver facilement le·a propriétaire en cas de besoin.
  • Automatiser le suivi des expirations.
  • Éviter la création de comptes « orphelins ».

Questions :

  • Existe-t-il une méthode ou une bonne pratique pour gérer ces cas, que j’aurais pu manquer dans la documentation ?
  • Une évolution de l’API est-elle envisagée pour répondre à ce besoin de traçabilité ?
  • Comment gérez-vous ces questions dans vos propres organisations ?

Merci d’avance pour vos retours et suggestions !

Pour information, il existe une issue Github pour demander une évolution dans ce sens : Service Accounts must be independent of individual users · Issue #2123 · gristlabs/grist-core · GitHub En plus du présent fil de discussion, c’est toujours utile de liker ou de commenter sur Github pour donner plus de poids à la demande !