> ## Documentation Index
> Fetch the complete documentation index at: https://docs.elding.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Le Proxy

> Comment Elding injecte tes clés d'API HTTP sans qu'elles touchent ton app.

<Note>
  Le proxy est réservé aux **clés API HTTP** (OpenAI, Stripe, Resend, Anthropic...) :
  celles qui partent dans un en-tête `Authorization` ou `x-api-key` vers une API HTTPS.
  Les variables non HTTP (`DATABASE_URL`, `JWT_SECRET`, `REDIS_URL`...) restent dans les
  variables d'environnement de ton hébergeur : Elding ne les stocke pas et ne les injecte pas.
</Note>

## Principe

En mode proxy, ton app utilise un **placeholder** `{{NOM_CLE}}` pour une clé API HTTP.
Le proxy local intercepte chaque requête sortante, remplace le placeholder par la vraie valeur,
et forward vers l'upstream.

```
App → http://127.0.0.1:PORT → [proxy substitue {{OPENAI_API_KEY}}] → https://api.openai.com
```

La vraie clé vit dans le proxy (process séparé), **jamais** dans la mémoire de ton app.

## Traitement d'une requête

<Steps>
  <Step title="Authentification">
    Le proxy vérifie le `x-elding-token` (comparaison constant-time). Seul l'enfant lancé par
    `elding proxy` le possède.
  </Step>

  <Step title="Anti-SSRF">
    Le hostname cible est résolu ; toute IP privée, loopback, link-local ou métadata cloud
    (`169.254.169.254`) est bloquée. DNS-pinning contre le rebinding.
  </Step>

  <Step title="Host-lock">
    Pour chaque placeholder utilisé, le proxy vérifie que le domaine autorisé de la clé
    correspond à la cible. Sinon : 403 (anti-exfiltration).
  </Step>

  <Step title="Injection & forward">
    Les placeholders sont substitués dans les en-têtes, la requête est forwardée en streaming
    (HTTPS uniquement).
  </Step>
</Steps>

## Sécurité du proxy

* Bind `127.0.0.1` uniquement, jamais exposé au réseau.
* Token de session aléatoire, comparaison constant-time.
* HTTPS only, en-têtes hop-by-hop strippés.
* Logs sans valeurs (noms de placeholders only).

<Note>
  Une dépendance vérolée ou un agent IA dans ton app ne voit que `{{OPENAI_API_KEY}}`,
  jamais la vraie clé.
</Note>
