Aller au contenu
Guide

Les agents IA appellent votre API : 5 erreurs d'authentification qui créent des portes dérobées

| 9 min read

80 % des équipes utilisent des agents IA en production, mais seulement 22 % les traitent comme des identités indépendantes. Cinq erreurs d'authentification qui transforment votre API en porte ouverte.

Digital padlock on circuit board representing API authentication security
Photo by Adi Goldstein on Unsplash

Une enquête réalisée en 2026 auprès de plus de 900 praticiens a révélé que 80,9 % des équipes d'ingénierie utilisent des agents d'IA en test ou en production. La même enquête a révélé que seulement 21,9 % traitent ces agents comme des entités identitaires indépendantes. Le reste partage informations d'identification, ignorez les pistes d'audit et accordez un accès API global au code qui s'exécute sans supervision.

Cette lacune constitue un problème de sécurité. L'OWASP a publié son Top 10 des applications agentiques en 2026, ainsi que l'utilisation abusive d'outils et L'escalade de privilèges arrive en tête de liste avec 520 incidents signalés. Meta a documenté un agent d'IA malveillant qui a réussi chaque contrôle d'identité car il détenait des informations d'identification valides provenant d'un scénario d'adjoint confus. 48,9 % des organisations ne peuvent pas voir même ce que font leurs agents avec l'accès à l'API.

Cet article couvre les cinq erreurs d'authentification qui transforment votre API en une porte ouverte pour les agents IA, et comment les fermer. un avec un code fonctionnel.

Erreur 1 : partager une seule clé API entre tous les agents

44 % des équipes utilisent des clés API statiques pour les agents IA. Lorsque plusieurs agents partagent une clé, vous perdez trois choses : l'audit trails (quel agent a fait cette demande ?), révocation granulaire (la révocation d'un agent les tue tous) et limitation du taux par agent (un agent en fuite épuise le quota pour chaque agent).

# Three different agents share one API key
# Agent A: summarizes support tickets
# Agent B: processes refunds
# Agent C: exports customer PII

curl -X POST https://api.acme.com/v1/customers/export \\
  -H "Authorization: Bearer sk_live_shared_key_for_all_agents" \\
  -H "Content-Type: application/json" \\
  -d '{"format": "csv", "include_pii": true}'

# Which agent made this request? You can't tell.
# Need to revoke Agent C? You break A and B too.

La solution : émettre un identifiant unique par agent. Chaque clé correspond à une identité d'agent spécifique, une portée définie de points de terminaison et sa propre limite de débit. Lorsque vous devez révoquer l'agent C, les agents A et B continuent de fonctionner.

# Each agent gets its own scoped API key
curl -X POST https://api.acme.com/v1/tickets/summary \\
  -H "Authorization: Bearer sk_live_agent_a_tickets_readonly" \\
  -H "X-Agent-ID: agent-ticket-summarizer" \\
  -H "Content-Type: application/json" \\
  -d '{"ticket_id": "TKT-4829"}'

Utilisez le X-Agent-ID en-tête à côté de la clé API afin que vos journaux attribuent toujours les requêtes à un agent spécifique. Décodez le jeton pour vérifier que ses revendications correspondent à l'agent qui effectue l'appel.

# Inspect what permissions an agent token carries
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
  -H "Content-Type: application/json" \\
  -d '{"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZ2VudC1yZWZ1bmQtcHJvY2Vzc29yIiwic2NvcGVzIjpbInJlZnVuZHM6d3JpdGUiLCJvcmRlcnM6cmVhZCJdLCJleHAiOjE3NDk2MDAsMDAwLCJpc3MiOiJhY21lLWF1dGgifQ.signature"}'
{
  "success": true,
  "data": {
    "header": {
      "alg": "RS256",
      "typ": "JWT"
    },
    "payload": {
      "sub": "agent-refund-processor",
      "scopes": ["refunds:write", "orders:read"],
      "exp": 1749600000,
      "iss": "acme-auth"
    }
  }
}

Le problème confus des adjoints : L'incident de l'agent voyou de Meta s'est produit parce que l'agent détenait des informations d'identification valides qui accordaient un accès au-delà de la portée prévue. L'agent a passé tous les contrôles d'identité. Le les pouvoirs étaient légitimes. Le problème était que personne ne les adaptait à l'objectif de l'agent.

Erreur 2 : accorder un accès complet à l'API lorsqu'un agent a besoin d'un point de terminaison

35 % des organisations s'appuient sur des comptes de services partagés pour les agents IA. Un compte de service avec un accès complet à l'API Cela signifie que votre agent de synthèse des tickets peut également traiter les remboursements, exporter les informations personnelles des clients et supprimer des enregistrements. C'est un principe de violation du moindre privilège.

Étendez chaque jeton d'agent aux points de terminaison et aux actions minimum dont il a besoin. Un agent de traitement des remboursements obtient refunds:write et orders:read. Rien de plus.

// Mint a scoped token for each agent at deploy time
interface AgentTokenClaims {
  sub: string;          // unique agent identity
  scopes: string[];     // minimum required permissions
  exp: number;          // short TTL: 1-24 hours
  iss: string;          // your auth service
  rate_limit: number;   // requests per minute for this agent
}

const agentClaims: AgentTokenClaims = {
  sub: "agent-refund-processor",
  scopes: ["refunds:write", "orders:read"],
  exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour
  iss: "acme-auth",
  rate_limit: 30,
};

Avant de déployer un agent, vérifiez que son jeton comporte les étendues correctes et n'a pas expiré. Décoder le jeton avec le point de terminaison Botoi JWT pour inspecter les réclamations et les is_expired drapeau.

# Decode the token and check expiry before trusting claims
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
  -H "Content-Type: application/json" \\
  -d '{
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZ2VudC10aWNrZXQtc3VtbWFyaXplciIsInNjb3BlcyI6WyJ0aWNrZXRzOnJlYWQiXSwiZXhwIjoxNzQ5Njg2NDAwfQ.abc123"
  }'
{
  "success": true,
  "data": {
    "header": {
      "alg": "HS256",
      "typ": "JWT"
    },
    "payload": {
      "sub": "agent-ticket-summarizer",
      "scopes": ["tickets:read"],
      "exp": 1749686400
    },
    "signature": "abc123",
    "is_expired": false,
    "expires_at": "2025-06-11T22:40:00.000Z",
    "expires_in_seconds": 3600
  }
}
Approche Contrôle de la portée Révocation Piste d'audit Risque
Compte de service partagé Aucune Brise tous les agents Aucune attribution Haut
Clé API statique par agent Niveau clé uniquement Par agent Par clé Moyen
JWT limité par agent Point de terminaison + action Par agent + expiration Réclamations complètes Faible
Échange de jetons OBO Hérité + rétréci Par session Chaîne complète Le plus bas

Les nouvelles solutions IAM pour les agents IA prennent en charge l'échange de jetons On-Behalf-Of (OBO). L'agent reçoit un jeton dérivé de la session de l'utilisateur d'origine, automatiquement limité aux autorisations accordées par l'utilisateur. Ceci Cette approche crée une chaîne d'autorisation complète de l'utilisateur à l'agent en passant par l'API.

Erreur 3 : pas d'expiration des identifiants de l'agent

43 % des équipes utilisent l'authentification par nom d'utilisateur/mot de passe pour les agents IA. Ces informations d'identification n'expirent pas. API statique les clés n'expirent pas non plus, à moins que vous n'intégriez l'expiration dans votre système. Un titre d'agent qui dure pour toujours est un identifiant qui peut être volé, divulgué dans les journaux ou enregistré dans un référentiel et exploité des mois plus tard.

Définissez une durée de vie maximale de 1 à 24 heures sur les jetons d'agent. Générez un nouvel identifiant à chaque déploiement ou sur un calendrier. Utilisez le générateur de mots de passe Botoi pour créer des secrets à haute entropie pour la signature HMAC.

# Generate a high-entropy secret for HMAC signing
curl -s -X POST https://api.botoi.com/v1/password/generate \\
  -H "Content-Type: application/json" \\
  -d '{"length": 64, "uppercase": true, "lowercase": true, "numbers": true, "symbols": false}'
{
  "success": true,
  "data": {
    "password": "kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG"
  }
}

Ajouter la signature de requête HMAC

Au-delà de l'authentification basée sur des jetons, signez chaque charge utile de demande avec HMAC-SHA256. Votre API vérifie la signature avant traiter la demande. Cela prouve que la charge utile n'a pas été altérée pendant le transport et lie chaque demande à un secret d'agent spécifique.

# Sign a request payload so your API can verify the sender
PAYLOAD='{"agent_id":"agent-refund-processor","action":"refund","order_id":"ORD-7291"}'

curl -s -X POST https://api.botoi.com/v1/hash/hmac \\
  -H "Content-Type: application/json" \\
  -d "{
    \\"text\\": \\"$PAYLOAD\\",
    \\"key\\": \\"kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG\\",
    \\"algorithm\\": \\"sha256\\"
  }"
{
  "success": true,
  "data": {
    "hmac": "a3f8c2d1e5b7094f6d2c8a1e3b5f7d9e4c6a8b0d2f4e6c8a0b2d4f6e8c0a2b4",
    "algorithm": "sha256"
  }
}

Votre serveur API recalcule le HMAC à l'aide de sa copie stockée du secret de l'agent. Si les hachages correspondent, le la demande est authentique. Si ce n’est pas le cas, rejetez-le.

Automatisez la rotation des secrets

La rotation manuelle ne s'adapte pas lorsque vous exécutez des dizaines d'agents. Créez un script de rotation qui génère un nouveau secret, le déploie, vérifie la connectivité, puis révoque l'ancien.

import Botoi from "@botoi/sdk";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

async function rotateAgentSecret() {
  // Generate a new 64-character secret
  const { data } = await botoi.password.generate({
    length: 64,
    uppercase: true,
    lowercase: true,
    numbers: true,
    symbols: false,
  });

  console.log("New secret generated. Deploy to agent, then revoke the old one.");

  // Hash the new secret for storage (never store plaintext)
  const hashed = await botoi.hash.sha256({ input: data.password });
  console.log("Hashed for DB:", hashed.data.hash);

  return { secret: data.password, hash: hashed.data.hash };
}

rotateAgentSecret();

Erreur 4 : ignorer la journalisation des demandes pour les appels de machine à machine

48,9 % des organisations ignorent le trafic de machine à machine. Ils enregistrent les appels d'API humains mais exemptent les appels internes communication de service à service à partir de leur pile d'observabilité. Les agents de l’IA tombent dans cet angle mort.

Lorsqu'un agent se comporte mal, envoie un flot de requêtes, accède à des points de terminaison en dehors de sa portée ou obtient compromis, vous devez répondre à trois questions : quel agent, quand et qu'a-t-il touché ? Sans demande en vous connectant, vous ne pouvez répondre à aucune d'entre elles.

// Express middleware: log every agent request
app.use("/v1/*", (req, res, next) => {
  const agentId = req.headers["x-agent-id"] || "unknown";
  const start = Date.now();

  res.on("finish", () => {
    const log = {
      timestamp: new Date().toISOString(),
      agent_id: agentId,
      method: req.method,
      path: req.path,
      status: res.statusCode,
      duration_ms: Date.now() - start,
      ip: req.ip,
      user_agent: req.headers["user-agent"],
    };
    console.log(JSON.stringify(log));
  });

  next();
});

Capturez l'identité de l'agent, le point de terminaison, la méthode HTTP, le code d'état et la durée de chaque demande. Envoi structuré logs sur votre plateforme d’observabilité. Définir des alertes en cas d'anomalies : pics soudains du volume de demandes, demandes de des points de terminaison en dehors de la portée de l'agent ou des taux d'erreur élevés.

Suivez ce que l'agent envoie, et non ce qu'il dit envoyer. Enregistrez le hachage de la charge utile de la demande (en utilisant /v1/hash) à côté des métadonnées. Cela vous donne une preuve d'altération sans stocker des charges utiles sensibles dans votre système de journalisation.

Erreur 5 : traiter l'authentification de l'agent de la même manière que l'authentification humaine

Seuls 18 % des responsables de la sécurité sont convaincus que leurs systèmes IAM peuvent gérer les identités des agents. L'autre boulon à 82 % l'accès des agents aux flux d'authentification humaine qui n'ont pas été conçus pour les appelants autonomes.

L'authentification humaine suppose qu'une personne lit un écran de consentement OAuth, saisit un mot de passe et répond à une invite MFA. Les agents ne font rien de tout ça. Ils ont besoin d'un modèle d'authentification différent avec trois propriétés.

1. Jetons étendus avec des autorisations explicites

Chaque jeton d'agent déclare les points de terminaison qu'il peut appeler et les actions qu'il peut effectuer. L'API applique ces portées sur chaque demande. Aucune portée, aucun accès.

2. Limites de taux par identité

Un utilisateur humain envoie quelques requêtes par minute. Un agent en envoie des centaines ou des milliers. Limites de tarifs par agent L'identité empêche un agent d'affamer les autres et limite le rayon d'explosion si un agent devient voyou.

3. Demander l'attribution à chaque couche

Chaque requête transporte l'identité de l'agent du proxy Edge via la couche application jusqu'à la base de données. journal des requêtes. Lorsque quelque chose ne va pas, vous tracez le chemin complet depuis l’agent jusqu’à l’action.

Auditer un jeton d'agent avec le SDK Botoi

Combinez les points de terminaison JWT et de mot de passe en une seule fonction d'audit. Décoder le token, vérifier son expiration, vérifiez la signature et signalez les portées trop larges.

import Botoi from "@botoi/sdk";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

async function auditAgentToken(token: string, secret: string) {
  // Step 1: Decode to inspect claims
  const decoded = await botoi.jwt.decode({ token });
  const claims = decoded.data.payload;

  console.log("Agent:", claims.sub);
  console.log("Scopes:", claims.scopes);

  // Step 2: Check expiration
  const now = Math.floor(Date.now() / 1000);
  const hoursLeft = (claims.exp - now) / 3600;

  if (hoursLeft < 0) {
    console.error("Token expired", Math.abs(hoursLeft).toFixed(1), "hours ago");
    return { valid: false, reason: "expired" };
  }

  if (hoursLeft > 24) {
    console.warn("Token lives longer than 24 hours; rotate sooner");
  }

  // Step 3: Verify signature
  const verified = await botoi.jwt.verify({ token, secret, algorithms: ["HS256"] });

  if (!verified.data.valid) {
    console.error("Signature verification failed");
    return { valid: false, reason: "invalid_signature" };
  }

  // Step 4: Check scope breadth
  const dangerousScopes = claims.scopes.filter(
    (s: string) => s === "*" || s === "admin" || s.endsWith(":*")
  );

  if (dangerousScopes.length > 0) {
    console.warn("Overly broad scopes:", dangerousScopes);
  }

  return { valid: true, agent: claims.sub, scopes: claims.scopes, hoursLeft };
}

const result = await auditAgentToken(process.env.AGENT_TOKEN!, process.env.SIGNING_SECRET!);
console.log(result);

Exécutez cette vérification comme étape préalable au déploiement. Si le jeton est expiré, a un TTL supérieur à 24 heures, échoue à la signature vérification, ou comporte des étendues génériques, bloque le déploiement.

Une liste de contrôle pour l'authentification API de l'agent IA

Vérifier Que vérifier Botoi endpoint
Identité unique par agent Deux agents ne partagent pas une clé ou un jeton sub réclamer /v1/jwt/decode
Portées minimales Les portées des jetons correspondent à l'objectif de l'agent ; pas de caractères génériques /v1/jwt/decode
Expiration du jeton TTL sous 24 heures ; mécanisme de rafraîchissement en place /v1/jwt/decode
Demande de signature Correspondances de charge utile HMAC côté serveur /v1/hash/hmac
Rotation secrète Les secrets tournent lors du déploiement ou selon un calendrier /v1/password/generate
Journalisation des demandes Chaque demande d'agent est enregistrée avec le hachage d'identité et de charge utile /v1/hash

Les données de l’enquête sont claires : les équipes déploient des agents IA plus rapidement qu’elles ne les sécurisent. 80,9 % ont des agents en activité, mais moins d’un agent sur cinq donne à ces agents leur propre identité. Chaque erreur sur cette liste, clés partagées, portées larges, informations d'identification permanentes, trafic silencieux, authentification en forme humaine, est une porte dérobée attendant le prochain adjoint confus incident.

Choisissez une erreur dans cette liste. Corrigez-le cette semaine. Passez ensuite au suivant.

FAQ

Les agents IA doivent-ils utiliser les mêmes clés API que les utilisateurs humains ?
Non. Les agents IA ont besoin d’informations d’identification dédiées avec des autorisations étendues, des limites de débit par identité et une expiration automatique. Une enquête réalisée en 2026 auprès de plus de 900 praticiens a révélé que seulement 21,9 % des équipes traitent les agents comme des entités indépendantes portant une identité, et que 44 % partagent toujours des clés API statiques entre les agents.
Comment effectuer une rotation des clés API pour les agents IA sans temps d'arrêt ?
Générez un nouvel identifiant, déployez-le sur l'agent, vérifiez qu'il fonctionne, puis révoquez l'ancienne clé. Utilisez des jetons de courte durée (1 à 24 heures) avec actualisation automatique afin que la rotation se fasse sans étapes manuelles. Le point de terminaison Botoi /v1/password/generate crée des secrets à haute entropie et /v1/jwt/decode inspecte le nouveau jeton avant de procéder au basculement.
Qu'est-ce que le Top 10 OWASP pour les applications agentiques ?
Publié en 2026, le Top 10 OWASP pour les applications agentiques répertorie les risques de sécurité les plus courants lorsque les agents IA interagissent avec les API et les outils. L'utilisation abusive d'outils et l'escalade des privilèges arrivent en tête de liste avec 520 incidents signalés. D'autres risques incluent un contrôle d'accès insuffisant, des pistes d'audit manquantes et des attaques confuses des adjoints.
Comment surveiller le trafic API de machine à machine provenant des agents IA ?
Enregistrez chaque demande avec l'identité de l'agent, l'horodatage, le point de terminaison et le hachage de la charge utile. Utilisez des journaux JSON structurés et envoyez-les à un système centralisé (Datadog, Grafana ou CloudWatch). Une étude de 2026 a révélé que 48,9 % des organisations ne peuvent pas du tout surveiller le trafic des agents IA, les laissant aveugles aux agents compromis ou au comportement inapproprié.
Qu’est-ce qu’une attaque adjointe confuse dans le contexte des agents IA ?
Une attaque adjointe confuse se produit lorsqu'un agent IA utilise ses informations d'identification légitimes pour effectuer des actions non prévues par son opérateur. L'agent réussit tous les contrôles d'identité car il détient des jetons valides, mais il agit sur les instructions provenant d'une source non fiable. Meta a documenté ce modèle dans un incident d'agent malveillant au cours duquel l'agent a accédé à des ressources au-delà de sa portée prévue.

Commencez a construire avec botoi

150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.