claude-apps-gateway-deploy.md +28 −26
6 6
7> Enregistrez la passerelle auprès de votre fournisseur d'identité, créez le conteneur, déployez sur Kubernetes ou Cloud Run, et exploitez-la : vérifications de santé, rotation des secrets, mises à jour et sécurité.7> Enregistrez la passerelle auprès de votre fournisseur d'identité, créez le conteneur, déployez sur Kubernetes ou Cloud Run, et exploitez-la : vérifications de santé, rotation des secrets, mises à jour et sécurité.
8 8
99Cette page couvre l'aspect opérationnel de l'exécution de la [passerelle Claude apps](/fr/claude-apps-gateway) : enregistrement d'un client OAuth auprès de votre fournisseur d'identité (IdP), déploiement de la passerelle en tant que conteneur, et son exploitation au quotidien. Pour chaque option du fichier `gateway.yaml` que la passerelle lit au démarrage, consultez la [Référence de configuration](/fr/claude-apps-gateway-config).Cette page couvre l'aspect opérationnel de l'exécution de la [passerelle Claude apps](/docs/fr/claude-apps-gateway) : enregistrement d'un client OAuth auprès de votre fournisseur d'identité (IdP), déploiement de la passerelle en tant que conteneur, et son exploitation au quotidien. Pour chaque option du fichier `gateway.yaml` que la passerelle lit au démarrage, consultez la [Référence de configuration](/docs/fr/claude-apps-gateway-config).
10 10
11Un déploiement en production suit quatre étapes dans l'ordre, et les sections ci-dessous les correspondent. Les deux premières sont des choix à faire ; les deux dernières sont des documents de référence à consulter une fois qu'elle est en cours d'exécution.11Un déploiement en production suit quatre étapes dans l'ordre, et les sections ci-dessous les correspondent. Les deux premières sont des choix à faire ; les deux dernières sont des documents de référence à consulter une fois qu'elle est en cours d'exécution.
12 12
31 31
32Tout IdP conforme à OIDC fonctionne : Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate et autres. L'IdP doit répondre à trois exigences :32Tout IdP conforme à OIDC fonctionne : Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate et autres. L'IdP doit répondre à trois exigences :
33 33
3434* Servir `/.well-known/openid-configuration`, via HTTPS en production ; la passerelle accepte un [émetteur `http://`](/fr/claude-apps-gateway-config#oidc), et un émetteur de bouclage local nécessite en outre `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`* Servir `/.well-known/openid-configuration`, via HTTPS en production ; la passerelle accepte un [émetteur `http://`](/docs/fr/claude-apps-gateway-config#oidc), et un émetteur de bouclage local nécessite en outre `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`
35* Supporter le flux de code d'autorisation. PKCE (Proof Key for Code Exchange) est activé par défaut ; désactivez-le avec `oidc.use_pkce: false` pour les IdP qui ne le supportent pas35* Supporter le flux de code d'autorisation. PKCE (Proof Key for Code Exchange) est activé par défaut ; désactivez-le avec `oidc.use_pkce: false` pour les IdP qui ne le supportent pas
36* Retourner `email` et optionnellement `groups` dans l'id\_token, ou les servir à partir du point de terminaison userinfo avec `oidc.userinfo_fallback: true`36* Retourner `email` et optionnellement `groups` dans l'id\_token, ou les servir à partir du point de terminaison userinfo avec `oidc.userinfo_fallback: true`
37 37
41 41
42* **Okta** : le serveur d'autorisation de l'organisation à `https://example.okta.com` retourne un id\_token mince qui omet `email` et `groups`, donc définissez `oidc.userinfo_fallback: true` chaque fois que vous l'utilisez comme `issuer`. Un serveur d'autorisation personnalisé tel que `https://example.okta.com/oauth2/default` qui inclut `email` et optionnellement `groups` dans l'id\_token les émet directement et n'a besoin d'aucun fallback. Okta émet `groups` uniquement lorsque la portée `groups` est demandée dans `oidc.scopes` et que le filtre de revendication de groupes de l'application le permet ; `userinfo_fallback` ne peut pas remplir une revendication pour laquelle l'IdP n'a pas été interrogé.42* **Okta** : le serveur d'autorisation de l'organisation à `https://example.okta.com` retourne un id\_token mince qui omet `email` et `groups`, donc définissez `oidc.userinfo_fallback: true` chaque fois que vous l'utilisez comme `issuer`. Un serveur d'autorisation personnalisé tel que `https://example.okta.com/oauth2/default` qui inclut `email` et optionnellement `groups` dans l'id\_token les émet directement et n'a besoin d'aucun fallback. Okta émet `groups` uniquement lorsque la portée `groups` est demandée dans `oidc.scopes` et que le filtre de revendication de groupes de l'application le permet ; `userinfo_fallback` ne peut pas remplir une revendication pour laquelle l'IdP n'a pas été interrogé.
43* **Microsoft Entra ID** : `issuer` = `https://login.microsoftonline.com/<tenant-id>/v2.0`. Entra émet des ID d'objet de groupe plutôt que des noms, donc utilisez les GUID dans `managed.policies.match.groups`, ou utilisez les rôles d'application pour des noms lisibles par l'homme. Si votre locataire émet des rôles sous `roles` au lieu de `groups`, définissez `oidc.groups_claim: roles`.43* **Microsoft Entra ID** : `issuer` = `https://login.microsoftonline.com/<tenant-id>/v2.0`. Entra émet des ID d'objet de groupe plutôt que des noms, donc utilisez les GUID dans `managed.policies.match.groups`, ou utilisez les rôles d'application pour des noms lisibles par l'homme. Si votre locataire émet des rôles sous `roles` au lieu de `groups`, définissez `oidc.groups_claim: roles`.
4444* **Google Workspace** : `issuer` = `https://accounts.google.com`. L'id\_token de Google ne porte pas de groupes. Pour utiliser `allowed_groups` basé sur les groupes ou `managed.policies` avec Google comme IdP, configurez [`oidc.google_groups`](/fr/claude-apps-gateway-config#oidc), qui recherche les groupes de chaque utilisateur via l'API Directory du SDK Admin en utilisant un compte de service avec délégation au niveau du domaine. Sans cela, utilisez `oidc.allowed_email_domains` pour le contrôle d'accès à l'adhésion et `managed.policies.match.email_domain` pour l'attribution de politique. Google ignore également la portée standard `offline_access`. Pour les jetons d'actualisation, définissez `oidc.scopes: [openid, profile, email]` et `oidc.extra_auth_params: { access_type: offline, prompt: consent }`.* **Google Workspace** : `issuer` = `https://accounts.google.com`. L'id\_token de Google ne porte pas de groupes. Pour utiliser `allowed_groups` basé sur les groupes ou `managed.policies` avec Google comme IdP, configurez [`oidc.google_groups`](/docs/fr/claude-apps-gateway-config#oidc), qui recherche les groupes de chaque utilisateur via l'API Directory du SDK Admin en utilisant un compte de service avec délégation au niveau du domaine. Sans cela, utilisez `oidc.allowed_email_domains` pour le contrôle d'accès à l'adhésion et `managed.policies.match.email_domain` pour l'attribution de politique. Google ignore également la portée standard `offline_access`. Pour les jetons d'actualisation, définissez `oidc.scopes: [openid, profile, email]` et `oidc.extra_auth_params: { access_type: offline, prompt: consent }`.
45 45
46Pour obtenir de l'aide auprès d'un fournisseur d'identité non couvert ci-dessus, consultez [Dépannage](#troubleshooting).46Pour obtenir de l'aide auprès d'un fournisseur d'identité non couvert ci-dessus, consultez [Dépannage](#troubleshooting).
47 47
48<Warning>48<Warning>
49 Les jetons d'actualisation permettent à la passerelle de renouveler la session d'un développeur silencieusement, sans renvoyer le développeur au navigateur. Ils pilotent également le déprovisionnement, car lorsque l'IdP désactive un utilisateur, l'actualisation suivante échoue et la session se termine dans `ttl_hours`. La passerelle demande `offline_access` par défaut pour obtenir un jeton d'actualisation. Si votre IdP nécessite un consentement explicite pour l'accès hors ligne, configurez le client OAuth pour l'autoriser.49 Les jetons d'actualisation permettent à la passerelle de renouveler la session d'un développeur silencieusement, sans renvoyer le développeur au navigateur. Ils pilotent également le déprovisionnement, car lorsque l'IdP désactive un utilisateur, l'actualisation suivante échoue et la session se termine dans `ttl_hours`. La passerelle demande `offline_access` par défaut pour obtenir un jeton d'actualisation. Si votre IdP nécessite un consentement explicite pour l'accès hors ligne, configurez le client OAuth pour l'autoriser.
50 50
5151 Si votre IdP ne peut pas du tout émettre de jetons d'actualisation, la passerelle fonctionne toujours, mais il n'y a pas de renouvellement silencieux, donc les développeurs réexécutent la connexion au navigateur lorsque leur session expire. Pour éviter que cela ne se produise toutes les heures, augmentez [`session.ttl_hours`](/fr/claude-apps-gateway-config#session) à `8` ou `12`. Le compromis est la latence de déprovisionnement, car sans jetons d'actualisation un utilisateur désactivé conserve l'accès jusqu'à l'expiration du TTL plus long. Si votre IdP ne peut pas du tout émettre de jetons d'actualisation, la passerelle fonctionne toujours, mais il n'y a pas de renouvellement silencieux, donc les développeurs réexécutent la connexion au navigateur lorsque leur session expire. Pour éviter que cela ne se produise toutes les heures, augmentez [`session.ttl_hours`](/docs/fr/claude-apps-gateway-config#session) à `8` ou `12`. Le compromis est la latence de déprovisionnement, car sans jetons d'actualisation un utilisateur désactivé conserve l'accès jusqu'à l'expiration du TTL plus long.
52</Warning>52</Warning>
53 53
54<h2 id="deployment">54<h2 id="deployment">
62Quelques décisions façonnent le déploiement au-delà de l'endroit où il s'exécute :62Quelques décisions façonnent le déploiement au-delà de l'endroit où il s'exécute :
63 63
64* **Coûts** : il n'y a pas de licence séparée ou de frais par siège pour la passerelle ; elle fait partie du binaire `claude`. Vous payez l'inférence via votre engagement cloud ou Anthropic existant, plus le calcul pour le conteneur et votre collecteur de télémétrie.64* **Coûts** : il n'y a pas de licence séparée ou de frais par siège pour la passerelle ; elle fait partie du binaire `claude`. Vous payez l'inférence via votre engagement cloud ou Anthropic existant, plus le calcul pour le conteneur et votre collecteur de télémétrie.
6565* **Contournement** : la passerelle n'impose pas que la seule route vers un modèle passe par elle. Un développeur avec sa propre credential peut toujours appeler le fournisseur directement, donc fermer ce chemin est une décision de politique réseau, par exemple bloquer la sortie vers `api.anthropic.com` sauf depuis la passerelle. Bloquer cette sortie casse également la [vérification de sécurité du domaine WebFetch](/fr/data-usage#webfetch-domain-safety-check), qui appelle `api.anthropic.com` depuis la machine de chaque développeur ; définissez `skipWebFetchPreflight: true` dans la politique gérée pour la désactiver.* **Contournement** : la passerelle n'impose pas que la seule route vers un modèle passe par elle. Un développeur avec sa propre credential peut toujours appeler le fournisseur directement, donc fermer ce chemin est une décision de politique réseau, par exemple bloquer la sortie vers `api.anthropic.com` sauf depuis la passerelle. Bloquer cette sortie casse également la [vérification de sécurité du domaine WebFetch](/docs/fr/data-usage#webfetch-domain-safety-check), qui appelle `api.anthropic.com` depuis la machine de chaque développeur ; définissez `skipWebFetchPreflight: true` dans la politique gérée pour la désactiver.
66* **Passerelles multiples** : chaque passerelle est un déploiement séparé avec sa propre configuration. Le CLI stocke son empreinte de confiance et ses credentials par nom d'hôte de passerelle, donc différentes équipes peuvent se connecter à différentes passerelles sans conflit. Pour servir plusieurs émetteurs OIDC, exécutez des instances séparées.66* **Passerelles multiples** : chaque passerelle est un déploiement séparé avec sa propre configuration. Le CLI stocke son empreinte de confiance et ses credentials par nom d'hôte de passerelle, donc différentes équipes peuvent se connecter à différentes passerelles sans conflit. Pour servir plusieurs émetteurs OIDC, exécutez des instances séparées.
67* **Sans serveur** : Cloud Run fonctionne ; définissez `min-instances: 1` pour éviter la découverte OIDC à froid. Lambda et Cloud Functions ne fonctionnent pas, car la passerelle est un serveur HTTP de longue durée.67* **Sans serveur** : Cloud Run fonctionne ; définissez `min-instances: 1` pour éviter la découverte OIDC à froid. Lambda et Cloud Functions ne fonctionnent pas, car la passerelle est un serveur HTTP de longue durée.
68 68
6969Chaque topologie de production ici place un proxy L7, tel qu'une Ingress, le front-end de Cloud Run ou un ALB, devant les répliques HTTP simples. Définissez [`listen.trusted_proxies`](/fr/claude-apps-gateway-config#listen) sur les plages sources du proxy afin que la passerelle lise les adresses IP des clients à partir de `X-Forwarded-For`. La passerelle honore l'en-tête uniquement lorsque le pair TCP est de confiance ; l'[exemple travaillé Google Cloud](/fr/claude-apps-gateway-on-gcp) a des valeurs concrètes par topologie. Sans proxies de confiance, chaque demande semble provenir de l'adresse IP du proxy, ce qui réduit les limites de débit par IP en un seul compartiment partagé et enregistre l'adresse IP du proxy dans les événements d'audit.Chaque topologie de production ici place un proxy L7, tel qu'une Ingress, le front-end de Cloud Run ou un ALB, devant les répliques HTTP simples. Définissez [`listen.trusted_proxies`](/docs/fr/claude-apps-gateway-config#listen) sur les plages sources du proxy afin que la passerelle lise les adresses IP des clients à partir de `X-Forwarded-For`. La passerelle honore l'en-tête uniquement lorsque le pair TCP est de confiance ; l'[exemple travaillé Google Cloud](/docs/fr/claude-apps-gateway-on-gcp) a des valeurs concrètes par topologie. Sans proxies de confiance, chaque demande semble provenir de l'adresse IP du proxy, ce qui réduit les limites de débit par IP en un seul compartiment partagé et enregistre l'adresse IP du proxy dans les événements d'audit.
70 70
71<h3 id="container-image">71<h3 id="container-image">
72 Image de conteneur72 Image de conteneur
74 74
75Créez votre propre image autour du binaire `claude` natif de la version standard de Claude Code :75Créez votre propre image autour du binaire `claude` natif de la version standard de Claude Code :
76 76
77771. Téléchargez la version Linux pour l'architecture de votre image à partir d'une version épinglée ; consultez [Installer une version spécifique](/fr/setup#install-a-specific-version) pour l'URL de téléchargement.1. Téléchargez la version Linux pour l'architecture de votre image à partir d'une version épinglée ; consultez [Installer une version spécifique](/docs/fr/setup#install-a-specific-version) pour l'URL de téléchargement.
78782. Vérifiez-la par rapport au `manifest.json` signé GPG de la version comme décrit dans [Intégrité binaire et signature de code](/fr/setup#binary-integrity-and-code-signing).2. Vérifiez-la par rapport au `manifest.json` signé GPG de la version comme décrit dans [Intégrité binaire et signature de code](/docs/fr/setup#binary-integrity-and-code-signing).
793. Copiez-la dans le contexte de construction.793. Copiez-la dans le contexte de construction.
80 80
81Miroitez la version dans votre registre interne si vos constructions ne peuvent pas atteindre l'hôte de version, et épinglez la version que votre flotte exécute.81Miroitez la version dans votre registre interne si vos constructions ne peuvent pas atteindre l'hôte de version, et épinglez la version que votre flotte exécute.
82 82
83Au-delà du binaire, l'image a besoin de :83Au-delà du binaire, l'image a besoin de :
84 84
8585* **Une image basée sur glibc** : la seule dépendance dynamique de la version glibc est les bibliothèques glibc. Les images basées sur Musl ont besoin de la version `linux-x64-musl` ou `linux-arm64-musl` plus des packages supplémentaires ; consultez [Configuration Alpine Linux](/fr/setup#alpine-linux-and-musl-based-distributions).* **Une image basée sur glibc** : la seule dépendance dynamique de la version glibc est les bibliothèques glibc. Les images basées sur Musl ont besoin de la version `linux-x64-musl` ou `linux-arm64-musl` plus des packages supplémentaires ; consultez [Configuration Alpine Linux](/docs/fr/setup#alpine-linux-and-musl-based-distributions).
86* **Un répertoire d'état inscriptible** : la passerelle s'exécute en tant qu'utilisateur quelconque, mais les images minimales n'ont pas de répertoire personnel inscriptible. Définissez `CLAUDE_CONFIG_DIR` sur un chemin inscriptible tel que `/tmp/.claude`.86* **Un répertoire d'état inscriptible** : la passerelle s'exécute en tant qu'utilisateur quelconque, mais les images minimales n'ont pas de répertoire personnel inscriptible. Définissez `CLAUDE_CONFIG_DIR` sur un chemin inscriptible tel que `/tmp/.claude`.
87* **La commande du conteneur** : `claude gateway --config /etc/claude/gateway.yaml`, avec le fichier de configuration monté en lecture seule et les secrets fournis en tant que variables d'environnement ; la passerelle écoute sur `listen.port`, par défaut `8080`.87* **La commande du conteneur** : `claude gateway --config /etc/claude/gateway.yaml`, avec le fichier de configuration monté en lecture seule et les secrets fournis en tant que variables d'environnement ; la passerelle écoute sur `listen.port`, par défaut `8080`.
88 88
99<Note>99<Note>
100 **Identité de charge de travail**100 **Identité de charge de travail**
101 101
102102 Préférez l'identité de charge de travail de la plateforme aux clés statiques : IRSA sur EKS pour Bedrock et pour Claude Platform sur AWS, Workload Identity sur GKE pour Agent Platform, et identité de charge de travail sur AKS pour Foundry. Définissez `auth: {}` dans le bloc en amont, ou `use_azure_ad: true` pour Foundry, et la passerelle récupère l'identité du pod via la chaîne de credentials par défaut de ce fournisseur. Pour un appairage inter-cloud, tel qu'un amont Bedrock sur GKE, définissez des credentials explicites dans le bloc `auth` de l'amont à la place. La [référence `upstreams`](/fr/claude-apps-gateway-config#upstreams) a des détails de configuration par plateforme. Préférez l'identité de charge de travail de la plateforme aux clés statiques : IRSA sur EKS pour Bedrock et pour Claude Platform sur AWS, Workload Identity sur GKE pour Agent Platform, et identité de charge de travail sur AKS pour Foundry. Définissez `auth: {}` dans le bloc en amont, ou `use_azure_ad: true` pour Foundry, et la passerelle récupère l'identité du pod via la chaîne de credentials par défaut de ce fournisseur. Pour un appairage inter-cloud, tel qu'un amont Bedrock sur GKE, définissez des credentials explicites dans le bloc `auth` de l'amont à la place. La [référence `upstreams`](/docs/fr/claude-apps-gateway-config#upstreams) a des détails de configuration par plateforme.
103</Note>103</Note>
104 104
105<h3 id="cloud-run">105<h3 id="cloud-run">
109Configurez le service comme suit :109Configurez le service comme suit :
110 110
111* Laissez `listen.port` à sa valeur par défaut de `8080`, qui correspond au `PORT` par défaut de Cloud Run, ou définissez `port: ${PORT}`111* Laissez `listen.port` à sa valeur par défaut de `8080`, qui correspond au `PORT` par défaut de Cloud Run, ou définissez `port: ${PORT}`
112112* Définissez `public_url` sur l'origine accessible de l'extérieur. Pour la production, c'est normalement le nom d'hôte d'un équilibreur de charge interne, car `/login` [rejette les adresses publiques](/fr/claude-apps-gateway#prerequisites) et l'URL `*.run.app` se résout en une, donc l'URL Cloud Run seule fonctionne uniquement pour un test de fumée `curl` ou navigateur. L'exception est un réseau où `*.run.app` se résout en privé via Private Service Connect et une zone privée Cloud DNS ; dans cette topologie l'URL Cloud Run est un `public_url` valide. L'[exemple travaillé Google Cloud](/fr/claude-apps-gateway-on-gcp#deploy-the-gateway) couvre les deux.* Définissez `public_url` sur l'origine accessible de l'extérieur. Pour la production, c'est normalement le nom d'hôte d'un équilibreur de charge interne, car `/login` [rejette les adresses publiques](/docs/fr/claude-apps-gateway#prerequisites) et l'URL `*.run.app` se résout en une, donc l'URL Cloud Run seule fonctionne uniquement pour un test de fumée `curl` ou navigateur. L'exception est un réseau où `*.run.app` se résout en privé via Private Service Connect et une zone privée Cloud DNS ; dans cette topologie l'URL Cloud Run est un `public_url` valide. L'[exemple travaillé Google Cloud](/docs/fr/claude-apps-gateway-on-gcp#deploy-the-gateway) couvre les deux.
113* Montez la configuration en tant que volume secret113* Montez la configuration en tant que volume secret
114* Définissez `min-instances: 1` pour éviter une découverte OIDC à froid à la première demande114* Définissez `min-instances: 1` pour éviter une découverte OIDC à froid à la première demande
115 115
116<Note>116<Note>
117117 Pour un exemple travaillé complet sur Google Cloud, couvrant Cloud Run ou GKE, Cloud SQL et Secret Manager, consultez [Déployer sur Google Cloud](/fr/claude-apps-gateway-on-gcp). Pour un exemple travaillé complet sur Google Cloud, couvrant Cloud Run ou GKE, Cloud SQL et Secret Manager, consultez [Déployer sur Google Cloud](/docs/fr/claude-apps-gateway-on-gcp).
118</Note>118</Note>
119 119
120<h3 id="push-the-gateway-url-to-developer-machines">120<h3 id="push-the-gateway-url-to-developer-machines">
121 Envoyer l'URL de la passerelle aux machines des développeurs121 Envoyer l'URL de la passerelle aux machines des développeurs
122</h3>122</h3>
123 123
124124Une fois que la passerelle est en service, envoyez `forceLoginMethod` et `forceLoginGatewayUrl` à la machine de chaque développeur via les paramètres gérés, via MDM ou en écrivant directement le fichier `managed-settings.json` par système d'exploitation. Sans cela, `/login` affiche le sélecteur de compte standard sans option de passerelle. Consultez [Paramètres gérés côté client](/fr/claude-apps-gateway-config#client-side-managed-settings) pour les chemins de fichiers.Une fois que la passerelle est en service, envoyez `forceLoginMethod` et `forceLoginGatewayUrl` à la machine de chaque développeur via les paramètres gérés, via MDM ou en écrivant directement le fichier `managed-settings.json` par système d'exploitation. Sans cela, `/login` affiche le sélecteur de compte standard sans option de passerelle. Consultez [Paramètres gérés côté client](/docs/fr/claude-apps-gateway-config#client-side-managed-settings) pour les chemins de fichiers.
125 125
126<h2 id="operations">126<h2 id="operations">
127 Opérations127 Opérations
160 160
161* **Sessions existantes** : les jetons porteurs valident localement avec le secret JWT, les actualisations de session ne touchent pas le magasin, et le processus de passerelle peut toujours servir l'inférence161* **Sessions existantes** : les jetons porteurs valident localement avec le secret JWT, les actualisations de session ne touchent pas le magasin, et le processus de passerelle peut toujours servir l'inférence
162* **Nouvelles connexions** : échouent jusqu'à la récupération de Postgres, car le flux d'appareil et ses compteurs de limite de débit vivent dans Postgres162* **Nouvelles connexions** : échouent jusqu'à la récupération de Postgres, car le flux d'appareil et ses compteurs de limite de débit vivent dans Postgres
163163* **[Application des limites de dépenses](/fr/claude-apps-gateway-spend-limits#postgres-availability)** : échoue ouvert par défaut pendant la panne, donc l'inférence continue de circuler ; basculez-la pour échouer fermé si vous préférez bloquer plutôt que de fonctionner sans compteur* **[Application des limites de dépenses](/docs/fr/claude-apps-gateway-spend-limits#postgres-availability)** : échoue ouvert par défaut pendant la panne, donc l'inférence continue de circuler ; basculez-la pour échouer fermé si vous préférez bloquer plutôt que de fonctionner sans compteur
164* **Disponibilité** : `/readyz` signale non-prêt pendant la panne, donc les orchestrateurs qui contrôlent le trafic sur la disponibilité retirent chaque réplique de la rotation à la fois. Dans cette topologie tout le trafic, y compris l'inférence que la passerelle pourrait toujours servir, échoue à l'équilibreur de charge jusqu'à la récupération de Postgres. La sonde de vivacité sur `/healthz` continue de passer, donc les répliques ne sont pas redémarrées. Pointez la sonde de disponibilité sur `/healthz` à la place si vous préférez que les développeurs connectés continuent de travailler pendant une panne du magasin ; le coût est que les nouvelles connexions échouent contre une réplique qui signale toujours prête.164* **Disponibilité** : `/readyz` signale non-prêt pendant la panne, donc les orchestrateurs qui contrôlent le trafic sur la disponibilité retirent chaque réplique de la rotation à la fois. Dans cette topologie tout le trafic, y compris l'inférence que la passerelle pourrait toujours servir, échoue à l'équilibreur de charge jusqu'à la récupération de Postgres. La sonde de vivacité sur `/healthz` continue de passer, donc les répliques ne sont pas redémarrées. Pointez la sonde de disponibilité sur `/healthz` à la place si vous préférez que les développeurs connectés continuent de travailler pendant une panne du magasin ; le coût est que les nouvelles connexions échouent contre une réplique qui signale toujours prête.
165 165
166Si votre IdP tombe en panne, les sessions existantes fonctionnent jusqu'à `ttl_hours`, et les nouvelles connexions et actualisations échouent. Définissez un `ttl_hours` plus long si votre IdP a des fenêtres de maintenance fréquentes.166Si votre IdP tombe en panne, les sessions existantes fonctionnent jusqu'à `ttl_hours`, et les nouvelles connexions et actualisations échouent. Définissez un `ttl_hours` plus long si votre IdP a des fenêtres de maintenance fréquentes.
191| `admin_audit` | Piste de mutation de l'API admin | `admin.audit_retention_days`, par défaut 365 |191| `admin_audit` | Piste de mutation de l'API admin | `admin.audit_retention_days`, par défaut 365 |
192| `principal_emails` | Email, nom d'affichage et groupes IdP de chaque principal vus en dernier. Contient des PII. | `admin.identity_retention_days` depuis la dernière activité, par défaut 90 |192| `principal_emails` | Email, nom d'affichage et groupes IdP de chaque principal vus en dernier. Contient des PII. | `admin.identity_retention_days` depuis la dernière activité, par défaut 90 |
193 193
194194Une boucle de 30 secondes expire les lignes `kv` au-delà de leur TTL, et un balayage horaire applique les fenêtres de rétention sur les tables de dépenses, donc rien ne croît sans limite. Sans [limites de dépenses](/fr/claude-apps-gateway-spend-limits) configurées, seul `kv` est écrit. Si votre politique de sécurité interdit DDL du rôle d'application, pré-créez ces tables et `_migrations` avec un rôle admin et accordez au rôle d'application `SELECT, INSERT, UPDATE, DELETE` sur chacun.Une boucle de 30 secondes expire les lignes `kv` au-delà de leur TTL, et un balayage horaire applique les fenêtres de rétention sur les tables de dépenses, donc rien ne croît sans limite. Sans [limites de dépenses](/docs/fr/claude-apps-gateway-spend-limits) configurées, seul `kv` est écrit. Si votre politique de sécurité interdit DDL du rôle d'application, pré-créez ces tables et `_migrations` avec un rôle admin et accordez au rôle d'application `SELECT, INSERT, UPDATE, DELETE` sur chacun.
195 195
196Avec les limites de dépenses en usage, une base de données perdue signifie le suivi des dépenses et les plafonds perdus, pas seulement les re-connexions des développeurs, donc exécutez des sauvegardes régulières. Pour effacer immédiatement un développeur parti plutôt que d'attendre la rétention, exécutez `DELETE FROM principal_emails WHERE principal = '<sub>'` directement ; cela supprime la seule table contenant son email, son nom et ses groupes. Les lignes `spend` et `admin_audit` ne référencent que le `sub` OIDC pseudonyme.196Avec les limites de dépenses en usage, une base de données perdue signifie le suivi des dépenses et les plafonds perdus, pas seulement les re-connexions des développeurs, donc exécutez des sauvegardes régulières. Pour effacer immédiatement un développeur parti plutôt que d'attendre la rétention, exécutez `DELETE FROM principal_emails WHERE principal = '<sub>'` directement ; cela supprime la seule table contenant son email, son nom et ses groupes. Les lignes `spend` et `admin_audit` ne référencent que le `sub` OIDC pseudonyme.
197 197
218| Données | Chemin | Envoyé à Anthropic par la passerelle |218| Données | Chemin | Envoyé à Anthropic par la passerelle |
219| ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------- |219| ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------- |
220| Inférence (invites, complétions) | CLI → passerelle → votre amont | Uniquement si l'API Anthropic est un amont configuré |220| Inférence (invites, complétions) | CLI → passerelle → votre amont | Uniquement si l'API Anthropic est un amont configuré |
221221| Télémétrie (métriques OTLP, plus [journaux et traces opt-in](/fr/claude-apps-gateway-config#telemetry)) | CLI → passerelle → votre collecteur | Jamais || Télémétrie (métriques OTLP, plus [journaux et traces opt-in](/docs/fr/claude-apps-gateway-config#telemetry)) | CLI → passerelle → votre collecteur | Jamais |
222| Identité (email, groupes, sub) | IdP → passerelle → JWT → CLI ; le CLI l'estampille sur les exports OTLP | Jamais |222| Identité (email, groupes, sub) | IdP → passerelle → JWT → CLI ; le CLI l'estampille sur les exports OTLP | Jamais |
223| Paramètres gérés | Votre YAML de passerelle → CLI | Jamais |223| Paramètres gérés | Votre YAML de passerelle → CLI | Jamais |
224| Journal d'audit | Stderr de passerelle → votre agrégateur | Jamais |224| Journal d'audit | Stderr de passerelle → votre agrégateur | Jamais |
237 237
238Deux menaces sont hors de portée car c'est votre infrastructure à sécuriser :238Deux menaces sont hors de portée car c'est votre infrastructure à sécuriser :
239 239
240240* **Un hôte de passerelle compromis** : l'hôte détient à la fois la credential en amont et distribue les [paramètres gérés](/fr/claude-apps-gateway-config#managed) à chaque développeur connecté, donc le contrôle de la configuration de la passerelle est comparable au contrôle de votre MDM. La boîte de dialogue d'approbation unique du CLI pour les paramètres capables de shell limite les changements silencieux mais ne remplace pas la sécurité de l'hôte.* **Un hôte de passerelle compromis** : l'hôte détient à la fois la credential en amont et distribue les [paramètres gérés](/docs/fr/claude-apps-gateway-config#managed) à chaque développeur connecté, donc le contrôle de la configuration de la passerelle est comparable au contrôle de votre MDM. La boîte de dialogue d'approbation unique du CLI pour les paramètres capables de shell limite les changements silencieux mais ne remplace pas la sécurité de l'hôte.
241* **Un fournisseur OIDC malveillant** : le fournisseur signe les id\_tokens que la passerelle fait confiance, donc il peut affirmer n'importe quelle identité. L'examen et la sécurisation de votre IdP sont votre responsabilité.241* **Un fournisseur OIDC malveillant** : le fournisseur signe les id\_tokens que la passerelle fait confiance, donc il peut affirmer n'importe quelle identité. L'examen et la sécurisation de votre IdP sont votre responsabilité.
242 242
243<h3 id="user-code-brute-force-resistance">243<h3 id="user-code-brute-force-resistance">
246 246
247Le `user_code` qu'un développeur tape dans la page de vérification `/device` est 8 caractères tirés d'un alphabet de 20 caractères, ce qui donne 20⁸ ou environ 2,56×10¹⁰ combinaisons, et il expire après 10 minutes.247Le `user_code` qu'un développeur tape dans la page de vérification `/device` est 8 caractères tirés d'un alphabet de 20 caractères, ce qui donne 20⁸ ou environ 2,56×10¹⁰ combinaisons, et il expire après 10 minutes.
248 248
249249La passerelle applique des limites de débit par IP sur les points de terminaison de subvention d'appareil, configurables via [`rate_limits`](/fr/claude-apps-gateway-config#http-tuning). Augmentez les limites si de nombreux développeurs se connectent à partir d'une seule adresse NAT d'entreprise partagée. Les limites s'appliquent uniquement au flux de connexion, pas à l'inférence.La passerelle applique des limites de débit par IP sur les points de terminaison de subvention d'appareil, configurables via [`rate_limits`](/docs/fr/claude-apps-gateway-config#http-tuning). Augmentez les limites si de nombreux développeurs se connectent à partir d'une seule adresse NAT d'entreprise partagée. Les limites s'appliquent uniquement au flux de connexion, pas à l'inférence.
250 250
251<h3 id="compliance-posture">251<h3 id="compliance-posture">
252 Posture de conformité252 Posture de conformité
255* **Résidence des données** : le plan de données de la passerelle elle-même n'envoie rien à Anthropic sauf si l'API Anthropic est un amont configuré ; lorsqu'elle l'est, votre accord de traitement des données existant s'applique au chemin d'inférence. La télémétrie, l'audit, l'identité et les paramètres vont uniquement aux destinations que vous configurez.255* **Résidence des données** : le plan de données de la passerelle elle-même n'envoie rien à Anthropic sauf si l'API Anthropic est un amont configuré ; lorsqu'elle l'est, votre accord de traitement des données existant s'applique au chemin d'inférence. La télémétrie, l'audit, l'identité et les paramètres vont uniquement aux destinations que vous configurez.
256* **Trafic du processus hôte** : le processus hôte est le CLI Claude Code, qui peut envoyer l'analytique de démarrage et les vérifications de mise à jour à Anthropic. Pour les déploiements à sortie stricte, définissez `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` dans l'environnement du conteneur de la passerelle.256* **Trafic du processus hôte** : le processus hôte est le CLI Claude Code, qui peut envoyer l'analytique de démarrage et les vérifications de mise à jour à Anthropic. Pour les déploiements à sortie stricte, définissez `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` dans l'environnement du conteneur de la passerelle.
257* **Analytique client** : le CLI désactive sa propre analytique d'utilisation lorsqu'il est connecté à une passerelle, et le rapport d'erreurs est désactivé par défaut sur les surfaces d'API tierces.257* **Analytique client** : le CLI désactive sa propre analytique d'utilisation lorsqu'il est connecté à une passerelle, et le rapport d'erreurs est désactivé par défaut sur les surfaces d'API tierces.
258258* **Machines client** : les CLI des développeurs envoient toujours les vérifications de nom d'hôte WebFetch et les vérifications de version à Anthropic sauf si `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` et `skipWebFetchPreflight: true` sont définis. Consultez [utilisation des données](/fr/data-usage).* **Machines client** : les CLI des développeurs envoient toujours les vérifications de nom d'hôte WebFetch et les vérifications de version à Anthropic sauf si `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` et `skipWebFetchPreflight: true` sont définis. Consultez [utilisation des données](/docs/fr/data-usage).
259* **Évaluations d'enquête** : la credential de passerelle désactive le puits d'évaluation lié à Anthropic, donc les évaluations ne sont pas envoyées à Anthropic.259* **Évaluations d'enquête** : la credential de passerelle désactive le puits d'évaluation lié à Anthropic, donc les évaluations ne sont pas envoyées à Anthropic.
260* **Partage de transcription** : choisir Oui sur une invite de partage de transcription d'enquête écrit un fichier local sous `~/.claude/feedback-bundles/` au lieu de télécharger vers Anthropic.260* **Partage de transcription** : choisir Oui sur une invite de partage de transcription d'enquête écrit un fichier local sous `~/.claude/feedback-bundles/` au lieu de télécharger vers Anthropic.
261* **Mises à jour client** : les vérifications de mise à jour sont séparées du trafic de passerelle. Épinglez les versions via votre propre distribution et définissez `DISABLE_UPDATES` si les ordinateurs portables ne doivent pas récupérer les versions. `DISABLE_AUTOUPDATER` arrête uniquement les mises à jour en arrière-plan tandis que `claude update` fonctionne toujours.261* **Mises à jour client** : les vérifications de mise à jour sont séparées du trafic de passerelle. Épinglez les versions via votre propre distribution et définissez `DISABLE_UPDATES` si les ordinateurs portables ne doivent pas récupérer les versions. `DISABLE_AUTOUPDATER` arrête uniquement les mises à jour en arrière-plan tandis que `claude update` fonctionne toujours.
262* **TLS** : servez `public_url` via HTTPS en production, soit à partir du propre écouteur de la passerelle via `listen.tls`, soit à partir d'une ingress terminant TLS devant les répliques HTTP simples avec `listen.public_url` défini. La passerelle ne refuse pas HTTP simple. L'IdP doit servir HTTPS en production, et Postgres supporte `?sslmode=require`. Définissez `Strict-Transport-Security` à votre ingress.262* **TLS** : servez `public_url` via HTTPS en production, soit à partir du propre écouteur de la passerelle via `listen.tls`, soit à partir d'une ingress terminant TLS devant les répliques HTTP simples avec `listen.public_url` défini. La passerelle ne refuse pas HTTP simple. L'IdP doit servir HTTPS en production, et Postgres supporte `?sslmode=require`. Définissez `Strict-Transport-Security` à votre ingress.
263263* **Divulgation de vulnérabilité** : suivez [Signaler les problèmes de sécurité](/fr/security#reporting-security-issues)* **Divulgation de vulnérabilité** : suivez [Signaler les problèmes de sécurité](/docs/fr/security#reporting-security-issues)
264 264
265<h2 id="troubleshooting">265<h2 id="troubleshooting">
266 Dépannage266 Dépannage
272* **Problème de connexion** : le développeur exécute `claude --debug-file ./claude-debug.txt`, reproduit et envoie ce fichier plus le journal d'audit de la passerelle pour la même fenêtre272* **Problème de connexion** : le développeur exécute `claude --debug-file ./claude-debug.txt`, reproduit et envoie ce fichier plus le journal d'audit de la passerelle pour la même fenêtre
273* **Problème d'inférence** : le modèle demandé, les amonts configurés et le journal d'audit de la passerelle pour la demande, qui enregistre quel amont l'a servie et le statut de la réponse273* **Problème d'inférence** : le modèle demandé, les amonts configurés et le journal d'audit de la passerelle pour la demande, qui enregistre quel amont l'a servie et le statut de la réponse
274 274
275La sortie d'erreur standard de la passerelle inclut le flux d'événements d'audit, le journal d'audit enregistre les identités des développeurs, et le fichier de débogage enregistre la sortie des hooks et du serveur MCP de la machine du développeur. Examinez et masquez ces informations avant de les publier sur un problème public.
276
275| Symptôme | Cause | Correctif |277| Symptôme | Cause | Correctif |
276| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |278| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
277279| Le `/login` d'un développeur affiche le sélecteur de compte standard au lieu de l'écran **Passerelle cloud** | `forceLoginMethod` ou `forceLoginGatewayUrl` n'est pas défini dans les paramètres gérés sur cette machine | Déployez le [fichier de paramètres gérés](/fr/claude-apps-gateway#set-the-gateway-url) sur l'appareil ; `/login` lit l'URL de la passerelle à partir de là || Le `/login` d'un développeur affiche le sélecteur de compte standard au lieu de l'écran **Passerelle cloud** | `forceLoginMethod` ou `forceLoginGatewayUrl` n'est pas défini dans les paramètres gérés sur cette machine | Déployez le [fichier de paramètres gérés](/docs/fr/claude-apps-gateway#set-the-gateway-url) sur l'appareil ; `/login` lit l'URL de la passerelle à partir de là |
278| Le démarrage affiche `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | La version de Claude Code installée est antérieure au support de la passerelle | Demandez au développeur de mettre à jour Claude Code vers une version qui inclut le support de la passerelle cloud |280| Le démarrage affiche `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | La version de Claude Code installée est antérieure au support de la passerelle | Demandez au développeur de mettre à jour Claude Code vers une version qui inclut le support de la passerelle cloud |
279281| CLI `/login` : `Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | Le nom d'hôte de la passerelle se résout en au moins une adresse IP publique. Claude Code vérifie chaque adresse résolue et exige que chacune soit privée. Une cause courante est un nom double pile où une famille se résout en une adresse publique, y compris les équilibreurs de charge double pile internes AWS, qui retournent des adresses AAAA de plage publique. {/* min-version: 2.1.206 */}Les points de terminaison de passerelle publique exploités par Anthropic sont exemptés de la vérification, et `/login` les accepte via `https://`. Avant v2.1.206, `/login` les rejetait comme n'importe quelle autre adresse publique | Faites en sorte que le nom de la passerelle se résout uniquement en adresses privées sur les machines des développeurs. Pour un nom double pile, supprimez l'enregistrement de plage publique ou servez un nom DNS interne uniquement séparé. Consultez la [prérequis de réseau privé](/fr/claude-apps-gateway#prerequisites). || CLI `/login` : `Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | Le nom d'hôte de la passerelle se résout en au moins une adresse IP publique. Claude Code vérifie chaque adresse résolue et exige que chacune soit privée. Une cause courante est un nom double pile où une famille se résout en une adresse publique, y compris les équilibreurs de charge double pile internes AWS, qui retournent des adresses AAAA de plage publique. {/* min-version: 2.1.206 */}Les points de terminaison de passerelle publique exploités par Anthropic sont exemptés de la vérification, et `/login` les accepte via `https://`. Avant v2.1.206, `/login` les rejetait comme n'importe quelle autre adresse publique | Faites en sorte que le nom de la passerelle se résout uniquement en adresses privées sur les machines des développeurs. Pour un nom double pile, supprimez l'enregistrement de plage publique ou servez un nom DNS interne uniquement séparé. Consultez la [prérequis de réseau privé](/docs/fr/claude-apps-gateway#prerequisites). |
280| CLI `/login` : `Gateway login requires a direct connection and does not support connecting through an HTTP proxy` | Un `HTTPS_PROXY` ou `HTTP_PROXY` s'applique à l'hôte de la passerelle et le nom d'hôte du proxy se résout en une adresse publique. Un proxy dont l'hôte se résout uniquement en adresses privées est autorisé et ne déclenche pas cette erreur | Ajoutez l'hôte de la passerelle à `NO_PROXY` sur la machine du développeur afin que la connexion soit directe, ou utilisez un proxy dont le nom d'hôte se résout en adresses privées |282| CLI `/login` : `Gateway login requires a direct connection and does not support connecting through an HTTP proxy` | Un `HTTPS_PROXY` ou `HTTP_PROXY` s'applique à l'hôte de la passerelle et le nom d'hôte du proxy se résout en une adresse publique. Un proxy dont l'hôte se résout uniquement en adresses privées est autorisé et ne déclenche pas cette erreur | Ajoutez l'hôte de la passerelle à `NO_PROXY` sur la machine du développeur afin que la connexion soit directe, ou utilisez un proxy dont le nom d'hôte se résout en adresses privées |
281| CLI `/login` : `Could not resolve gateway host <host>` | La machine ne peut pas résoudre le nom DNS interne de la passerelle, généralement parce qu'elle n'est pas sur le réseau d'entreprise | Demandez au développeur de se connecter à votre réseau ou VPN, puis réessayez `/login` |283| CLI `/login` : `Could not resolve gateway host <host>` | La machine ne peut pas résoudre le nom DNS interne de la passerelle, généralement parce qu'elle n'est pas sur le réseau d'entreprise | Demandez au développeur de se connecter à votre réseau ou VPN, puis réessayez `/login` |
282| Le démarrage se termine avec une erreur de validation de configuration nommant `store.postgres_url` | Aucun Postgres configuré ; la passerelle nécessite Postgres | Définissez `store.postgres_url`. Pour le développement local, utilisez un conteneur jetable : `docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`. |284| Le démarrage se termine avec une erreur de validation de configuration nommant `store.postgres_url` | Aucun Postgres configuré ; la passerelle nécessite Postgres | Définissez `store.postgres_url`. Pour le développement local, utilisez un conteneur jetable : `docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`. |
283285| Le démarrage se termine : `requires the native binary` | Exécution sous Node au lieu du binaire natif | Installez Claude Code avec l'une des [méthodes d'installation autonome](/fr/setup) || Le démarrage se termine : `requires the native binary` | Exécution sous Node au lieu du binaire natif | Installez Claude Code avec l'une des [méthodes d'installation autonome](/docs/fr/setup) |
284| Le démarrage se termine avec une erreur de découverte OIDC après `config.load` | `oidc.issuer` inaccessible, ou chaîne TLS non approuvée | Vérifiez que l'émetteur est accessible depuis le pod et sert `/.well-known/openid-configuration`. Définissez `ca_cert_pem` pour l'infrastructure à clé publique privée. |286| Le démarrage se termine avec une erreur de découverte OIDC après `config.load` | `oidc.issuer` inaccessible, ou chaîne TLS non approuvée | Vérifiez que l'émetteur est accessible depuis le pod et sert `/.well-known/openid-configuration`. Définissez `ca_cert_pem` pour l'infrastructure à clé publique privée. |
285| Le démarrage se termine avec une erreur de permission Postgres | Le rôle d'application manque `CREATE TABLE` | Pré-créez le schéma avec un rôle admin et accordez DML au rôle d'application, ou accordez DDL temporairement pour les démarrages qui appliquent de nouvelles migrations |287| Le démarrage se termine avec une erreur de permission Postgres | Le rôle d'application manque `CREATE TABLE` | Pré-créez le schéma avec un rôle admin et accordez DML au rôle d'application, ou accordez DDL temporairement pour les démarrages qui appliquent de nouvelles migrations |
286| `/oauth/callback` affiche « La connexion n'a pas pu être complétée » | Domaine de courrier rejeté, validation id\_token échouée, ou `email_verified` est explicitement `false`, que la passerelle rejette toujours sans remplacement | Vérifiez `allowed_email_domains` et que l'IdP retourne une revendication `email` vérifiée. Pour `email_verified: false`, corrigez la vérification côté IdP. Si votre IdP émet l'email sous un nom de revendication différent, définissez `oidc.email_claim`. |288| `/oauth/callback` affiche « La connexion n'a pas pu être complétée » | Domaine de courrier rejeté, validation id\_token échouée, ou `email_verified` est explicitement `false`, que la passerelle rejette toujours sans remplacement | Vérifiez `allowed_email_domains` et que l'IdP retourne une revendication `email` vérifiée. Pour `email_verified: false`, corrigez la vérification côté IdP. Si votre IdP émet l'email sous un nom de revendication différent, définissez `oidc.email_claim`. |
293| La connexion se termine à l'IdP mais le rappel échoue, avec une erreur CSP dans Chrome ou « ce lien de connexion a expiré » dans Safari | L'IdP a retourné le code via `response_mode=form_post`, qui l'auto-soumet inter-sites via POST à `/oauth/callback`. Chrome bloque cela sous une CSP stricte ; Safari autorise la soumission mais le rappel lit uniquement la chaîne de requête. | Assurez-vous que votre IdP honore `response_mode=query`, que la passerelle demande explicitement afin que le rappel soit une redirection simple |295| La connexion se termine à l'IdP mais le rappel échoue, avec une erreur CSP dans Chrome ou « ce lien de connexion a expiré » dans Safari | L'IdP a retourné le code via `response_mode=form_post`, qui l'auto-soumet inter-sites via POST à `/oauth/callback`. Chrome bloque cela sous une CSP stricte ; Safari autorise la soumission mais le rappel lit uniquement la chaîne de requête. | Assurez-vous que votre IdP honore `response_mode=query`, que la passerelle demande explicitement afin que le rappel soit une redirection simple |
294| La connexion fonctionne localement mais échoue derrière un ALB | `public_url` non défini, donc l'IdP obtient l'origine `http://` interne comme `redirect_uri` | Définissez `listen.public_url` sur l'origine `https://` externe |296| La connexion fonctionne localement mais échoue derrière un ALB | `public_url` non défini, donc l'IdP obtient l'origine `http://` interne comme `redirect_uri` | Définissez `listen.public_url` sur l'origine `https://` externe |
295| Le développeur voit l'invite de confiance à plusieurs reprises | Le certificat TLS tourne par réplique ou par demande | Utilisez un certificat stable à l'ingress, ou terminez TLS une fois et exécutez les répliques via HTTP simple en interne |297| Le développeur voit l'invite de confiance à plusieurs reprises | Le certificat TLS tourne par réplique ou par demande | Utilisez un certificat stable à l'ingress, ou terminez TLS une fois et exécutez les répliques via HTTP simple en interne |
296298| CLI `/login` : « Could not verify the gateway's TLS certificate » ou `SELF_SIGNED_CERT_IN_CHAIN` | La chaîne TLS de la passerelle est signée par une CA privée non dans le magasin de confiance de l'hôte CLI | Claude Code lit le magasin de confiance du système d'exploitation par défaut sur le binaire natif et sur Node 22.15 ou ultérieur ; [`CLAUDE_CODE_CERT_STORE`](/fr/network-config#ca-certificate-store) contrôle ce comportement. Si la CA est installée dans le magasin de confiance du système d'exploitation, assurez-vous que les développeurs utilisent un runtime actuel. Sinon, définissez `NODE_EXTRA_CA_CERTS` sur le PEM du certificat CA avant de lancer. L'invite d'empreinte de première connexion s'applique toujours. || CLI `/login` : « Could not verify the gateway's TLS certificate » ou `SELF_SIGNED_CERT_IN_CHAIN` | La chaîne TLS de la passerelle est signée par une CA privée non dans le magasin de confiance de l'hôte CLI | Claude Code lit le magasin de confiance du système d'exploitation par défaut sur le binaire natif et sur Node 22.15 ou ultérieur ; [`CLAUDE_CODE_CERT_STORE`](/docs/fr/network-config#ca-certificate-store) contrôle ce comportement. Si la CA est installée dans le magasin de confiance du système d'exploitation, assurez-vous que les développeurs utilisent un runtime actuel. Sinon, définissez `NODE_EXTRA_CA_CERTS` sur le PEM du certificat CA avant de lancer. L'invite d'empreinte de première connexion s'applique toujours. |
297 299
298<h2 id="related">300<h2 id="related">
299 Connexes301 Connexes
300</h2>302</h2>
301 303
302304* [Aperçu de la passerelle Claude apps](/fr/claude-apps-gateway) : démarrage rapide et connexion des développeurs* [Aperçu de la passerelle Claude apps](/docs/fr/claude-apps-gateway) : démarrage rapide et connexion des développeurs
303305* [Référence de configuration](/fr/claude-apps-gateway-config) : chaque option du fichier `gateway.yaml`* [Référence de configuration](/docs/fr/claude-apps-gateway-config) : chaque option du fichier `gateway.yaml`