Aller au contenu
Documentation
Français
Ouvrir l'application

Authentification

Obtenir un jeton de session avec auth/login, créer des jetons d'intégration à capacités limitées et les utiliser en toute sécurité.

Toutes les routes de l'API, hormis quelques routes publiques (status, ping, pricing, auth/login, auth/demo), exigent un jeton porteur dans l'en-tête Authorization.

GET /v1/auth/me HTTP/1.1
Host: api.novafisko.com
Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs
Accept: application/json

NovaFisko distingue deux sortes de jetons.

Type Obtenu par Portée Usage
Jeton de session POST /v1/auth/login Tous les droits de l'utilisateur Applications NovaFisko, scripts personnels
Jeton d'intégration POST /v1/auth/tokens Capacités choisies : read, write, sync Connexion d'une autre solution, serveur à serveur

Dans les deux cas, le jeton agit au nom d'un utilisateur : il voit les cabinets et les dossiers auxquels cet utilisateur a accès, ni plus ni moins. Un dossier inaccessible répond 404, jamais 403, pour ne pas révéler son existence.

Jeton de session

Se connecter

curl -X POST https://api.novafisko.com/v1/auth/login \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "email": "claire.dumont@fiduciaire-exemple.be",
    "password": "votre-mot-de-passe",
    "device_name": "script-export-mensuel"
  }'
Champ Type Obligatoire Description
email chaîne oui Adresse de l'utilisateur
password chaîne oui Mot de passe
device_name chaîne, 100 caractères max non Nom donné au jeton, api par défaut

Réponse 201 :

{
  "token": "57|n8Yw2c0vXk4JrPq1LmZs",
  "user": {
    "id": 12,
    "name": "Claire Dumont",
    "email": "claire.dumont@fiduciaire-exemple.be",
    "locale": "fr",
    "is_platform_admin": false,
    "firms": [
      {"public_token": "Fd7hQ2mN8sXa", "name": "Fiduciaire Exemple", "role": "admin"}
    ],
    "managed_firms": [
      {"public_token": "Fd7hQ2mN8sXa", "name": "Fiduciaire Exemple"}
    ]
  }
}

Des identifiants incorrects renvoient 422 avec une erreur sur le champ email. La route est limitée à 20 requêtes par minute et par adresse IP. Après 10 échecs, toute tentative est refusée pendant 5 minutes.

Note

Les utilisateurs d'une fiduciaire Novadesko se connectent avec leurs identifiants Novadesko. NovaFisko les vérifie en lecture seule, puis reflète le cabinet, ses membres et ses dossiers à chaque connexion.

Connaître l'utilisateur courant

GET /v1/auth/me renvoie le même objet user que la connexion, complété par is_demo (true pour un utilisateur du cabinet de démonstration). C'est l'appel idéal pour vérifier qu'un jeton est encore valide.

Se déconnecter

POST /v1/auth/logout révoque le jeton utilisé pour l'appel et répond 204 sans corps.

Jetons d'intégration

Un jeton d'intégration est conçu pour être confié à une autre solution. Il porte un nom, une liste de capacités, une date d'expiration facultative et la date de sa dernière utilisation.

Capacités

Capacité Autorise
read Toutes les requêtes GET et HEAD
write Les requêtes POST, PUT, PATCH et DELETE
sync Les routes companies/{company}/sync/* (bootstrap, pull, push, status, conflicts), quelle que soit la méthode

Les six routes de synchronisation hors ligne n'exigent que sync. Un connecteur qui se contente de suivre les changements avec sync/pull n'a donc besoin ni de read ni de write. La route POST companies/{company}/sync/novadesko, qui relance l'import depuis Novadesko, n'en fait pas partie : elle relève de write.

Créer un jeton

La création exige un jeton de session : un jeton d'intégration ne peut pas en créer d'autres.

curl -X POST https://api.novafisko.com/v1/auth/tokens \
  -H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Connecteur ERP Atelier",
    "abilities": ["read", "write"],
    "expires_in_days": 365
  }'
Champ Type Obligatoire Description
name chaîne, 100 caractères max oui Nom lisible, affiché dans la liste
abilities tableau oui, 1 valeur minimum Parmi read, write, sync
expires_in_days entier de 1 à 730, ou null non Durée de vie ; null ou absent : pas d'expiration

Réponse 201 :

{
  "token": "83|4Hq7ZtVb2Mx9KcLp0RsWyE1uNaJd6FgT",
  "integration_token": {
    "id": 83,
    "name": "Connecteur ERP Atelier",
    "abilities": ["read", "write"],
    "created_at": "2026-10-05T08:30:11+00:00",
    "expires_at": "2027-10-05T08:30:11+00:00",
    "last_used_at": null
  }
}

Un utilisateur peut détenir 50 jetons d'intégration au maximum. Au-delà, la création répond 422 avec le code token_limit_reached. La route est limitée à 20 créations par minute.

Attention

La valeur token n'est affichée qu'une seule fois, dans cette réponse. NovaFisko n'en conserve qu'une empreinte. Si vous la perdez, supprimez le jeton et créez-en un autre.

Lister les jetons

curl https://api.novafisko.com/v1/auth/tokens \
  -H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs"
{
  "data": [
    {
      "id": 83,
      "name": "Connecteur ERP Atelier",
      "abilities": ["read", "write"],
      "created_at": "2026-10-05T08:30:11+00:00",
      "expires_at": "2027-10-05T08:30:11+00:00",
      "last_used_at": "2026-10-05T09:02:47+00:00"
    }
  ]
}

Seuls vos propres jetons d'intégration sont listés. Les jetons de session des applications n'y figurent pas.

Révoquer un jeton

curl -X DELETE https://api.novafisko.com/v1/auth/tokens/83 \
  -H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs"

La réponse est 204. Le jeton cesse de fonctionner immédiatement. Un identifiant inconnu, ou qui n'est pas un de vos jetons d'intégration, répond 404.

Erreurs d'authentification

Statut code Cause Que faire
401 absent Jeton manquant, révoqué ou expiré Obtenir un nouveau jeton
403 token_ability_missing Le jeton d'intégration n'a pas la capacité requise Créer un jeton avec la capacité indiquée par required_ability
403 session_token_required Route réservée aux jetons de session (auth/tokens) Utiliser un jeton issu de auth/login
403 demo_mode Effet externe tenté depuis le cabinet de démonstration Tester cette action sur un vrai cabinet
422 token_limit_reached 50 jetons d'intégration existent déjà Révoquer les jetons inutilisés
422 absent Identifiants incorrects ou trop de tentatives Lire errors.email

Exemple de refus pour capacité manquante :

{
  "message": "Ce jeton n'a pas la capacité requise pour cette action.",
  "code": "token_ability_missing",
  "required_ability": "write"
}

Bonnes pratiques

  • Un jeton par intégration. Vous pourrez en révoquer un sans interrompre les autres, et la colonne de dernière utilisation restera lisible.
  • Le moins de capacités possible. Un outil de reporting n'a besoin que de read.
  • Une expiration. Fixez expires_in_days et planifiez le renouvellement avant l'échéance.
  • Un utilisateur dédié. Créez dans le cabinet un collaborateur réservé à l'intégration, avec le rôle strictement nécessaire. L'historique montrera clairement ce que l'intégration a fait.
  • Un stockage chiffré. Conservez le jeton dans un gestionnaire de secrets ou une variable d'environnement, jamais dans le code source, un dépôt Git ou une application exécutée dans le navigateur de vos clients.
  • HTTPS uniquement. N'envoyez jamais le jeton sur une connexion non chiffrée et ne le placez pas dans une URL.
Astuce

Si un jeton a pu fuiter, révoquez-le tout de suite avec DELETE /v1/auth/tokens/{id}. Consultez ensuite l'onglet Historique des dossiers concernés pour vérifier les actions effectuées.

Voir aussi