# auth.md

Vous etes un agent. Ce document decrit comment s'authentifier aupres d'ELEC INFRA. Suivez les etapes dans l'ordre. N'inventez pas de jetons.

## Resume

- L'API publique de devis n'exige **aucun OAuth**.
- Le CRM (operateurs humains) est protege par **Cloudflare Access** (OTP e-mail `@elecinfra.fr`).
- Il n'y a pas d'IdP interne qui emet des access_token hors Cloudflare Access.

## Decouverte

1. Lire la metadonnée de ressource protegee (RFC 9728) : `https://www.elecinfra.fr/.well-known/oauth-protected-resource` (`resource` = `https://crm.elecinfra.fr`, `authorization_servers` = `https://elecinfra.cloudflareaccess.com`).
2. Lire le serveur d'autorisation (RFC 8414) : `https://www.elecinfra.fr/.well-known/oauth-authorization-server` — les URLs `issuer`, `authorization_endpoint`, `token_endpoint`, `registration_endpoint` et `jwks_uri` sont celles de Cloudflare Access, pas un relais fictif.
3. Bloc `agent_auth` : `skill` = `https://www.elecinfra.fr/auth.md`, `register_uri` = `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/registration`, `identity_types_supported` = `["user"]`.

OIDC : `https://www.elecinfra.fr/.well-known/openid-configuration` et `https://elecinfra.cloudflareaccess.com/.well-known/openid-configuration`. JWKS Access : `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/certs`.

## API publique devis (sans OAuth)

Aucune inscription, aucun Bearer, aucun client_secret.

```http
POST /api/devis HTTP/1.1
Host: elecinfra.fr
Content-Type: application/json

{
  "leadType": "entreprise",
  "societe": "Exemple SAS",
  "nom": "Jean Dupont",
  "telephone": "0612345678",
  "email": "jean.dupont@example.com",
  "description": "Flotte 8 utilitaires, parking Toulouse",
  "consentementRGPD": true
}
```

Le consentement RGPD est obligatoire. Catalogue : `https://www.elecinfra.fr/.well-known/api-catalog`. Competences : `https://www.elecinfra.fr/.well-known/agent-skills/index.json`. MCP public (sans OAuth) : `https://www.elecinfra.fr/mcp` (carte `https://www.elecinfra.fr/.well-known/mcp/server-card.json`).

## CRM Cloudflare Access

Ressource : `https://crm.elecinfra.fr` (accueil `/`, fiches `/leads/:id`). Operateurs humains : OTP e-mail sur une adresse `@elecinfra.fr` (groupe Access « ELEC INFRA equipe »).

Les agents qui doivent agir **au nom d'un operateur** utilisent Managed OAuth de Cloudflare Access (RFC 8707) :

- Authorization : `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/authorization`
- Token : `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/token`
- Dynamic Client Registration : `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/registration`
- Issuer : `https://elecinfra.cloudflareaccess.com`

Access emet des jetons **opaques**. Ne les decodez pas comme des JWT. Presentez-les en `Authorization: Bearer` vers `https://crm.elecinfra.fr`. Cloudflare les resout et transmet `Cf-Access-Jwt-Assertion` a l'origine. La vitrine et `POST /api/devis` restent publics.

Nous n'implementons pas les flux WorkOS `anonymous`, `identity_assertion` (ID-JAG) ni `service_auth`. Pas de `claim_endpoint` interne : la ceremonie d'identite est celle d'Access (OTP e-mail).

## Enregistrement agent

1. **Outils publics** (devis, infos societe, liste des services) : aucun enregistrement. Appelez `https://www.elecinfra.fr/api/devis` ou `https://www.elecinfra.fr/mcp`.
2. **CRM / operateur** : enregistrez un client OAuth via `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/registration` (RFC 7591, Dynamic Client Registration Access), puis le flux authorization_code + PKCE S256. L'utilisateur se connecte avec un e-mail autorise.

## Identite

Types supportes : `user` uniquement (identite Access d'un humain de l'equipe). Pas d'identite agent anonyme ni d'assertion ID-JAG.

## Revocation

Utilisez `https://elecinfra.cloudflareaccess.com/cdn-cgi/access/oauth/revoke` (metadata Access). Les sessions Access expirent selon la politique CRM (24 h, access_token Managed OAuth 15 min).

## Contact humain

- Standard : 05 82 95 10 45
- Email : contact@elecinfra.fr
- Support : support@elecinfra.fr
