For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale

Configuration de la fédération d’identités de charge de travail pour Google Cloud

Utilisez Google Cloud comme fournisseur d’identité de charge de travail dans l’un des scénarios suivants :

  • Identité de charge de travail Google : Échangez un token OIDC signé par Google et émis pour un compte de service Google associé contre un jeton d’accès OpenAI de courte durée.
  • Google Kubernetes Engine : Échangez un token de compte de service GKE projeté contre un jeton d’accès OpenAI de courte durée.

Pour Codex, suivez les instructions de cette page pour obtenir et examiner le token Google. Ensuite, configurez l’identité de charge de travail Codex pour enregistrer ce token dans un fichier et indiquer son emplacement à Codex. Le mappage de compte de service et les exemples de SDK présentés sur cette page concernent l’API OpenAI.

Identité de charge de travail Google

Les charges de travail Google Cloud peuvent demander des tokens d’identité OIDC signés au serveur de métadonnées Google sans stocker de clés de compte de service de longue durée. Dans la fédération d’identités de charge de travail OpenAI, le token d’identité Google est le token de sujet qu’OpenAI valide avant d’émettre un jeton d’accès OpenAI. Ce flux fonctionne sur Compute Engine, Cloud Run, les charges de travail GKE utilisant des comptes de service Google associés et les autres environnements d’exécution gérés par Google qui exposent le point de terminaison d’identité du serveur de métadonnées.

Configuration de l’identité de charge de travail Google

Créez un compte de service Google pour la charge de travail qui doit appeler l’API OpenAI. Pour connaître la procédure de configuration complète, consultez le guide Google sur la création de comptes de service.

Par exemple, créez un compte de service avec la CLI Google Cloud :

gcloud iam service-accounts create openai-wif \
  --description="Service account for OpenAI workload identity federation" \
  --display-name="OpenAI workload identity federation"

Créez la VM Compute Engine en lui associant le compte de service, ou associez ce compte à la ressource Google Cloud qui exécute votre application. La ressource doit pouvoir appeler le serveur de métadonnées Google lors de l’exécution. Pour en savoir plus sur la configuration de la VM, consultez le guide Google sur la création d’une VM utilisant un compte de service géré par l’utilisateur.

Ne créez ni ne téléchargez de clés de compte de service pour ce flux. La charge de travail utilise le compte de service associé et le serveur de métadonnées pour demander un token OIDC de courte durée.

Obtention d’un token d’identité Google

Depuis la ressource Google Cloud à laquelle le compte de service est associé, demandez au serveur de métadonnées un token d’identité OIDC avec l’audience configurée. Ce token est le token de sujet qu’OpenAI échange contre un jeton d’accès émis par OpenAI.

AUDIENCE="https://api.openai.com/v1"

TOKEN=$(curl -sS -G -H "Metadata-Flavor: Google" \
  "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity" \
  --data-urlencode "audience=${AUDIENCE}")
export TOKEN

Le serveur de métadonnées renvoie un JWT signé par Google. Pour en savoir plus sur le point de terminaison d’identité du serveur de métadonnées, consultez le guide Google sur la vérification de l’identité d’une VM.

Vérifiez le token

Avant de configurer la fédération d’identités de charge de travail, exportez le token d’identité Google dans la variable TOKEN, puis exécutez ce script localement pour examiner ses revendications :

const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}
if (!/^[A-Za-z0-9_-]+$/.test(parts[1]) || parts[1].length % 4 === 1) {
  throw new Error("JWT payload is not valid Base64URL");
}

const bytes = Buffer.from(parts[1], "base64url");
if (bytes.toString("base64url") !== parts[1]) {
  throw new Error("JWT payload is not valid Base64URL");
}
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
const claims = JSON.parse(decoded);
if (claims === null || Array.isArray(claims) || typeof claims !== "object") {
  throw new Error("JWT payload is not a JSON object");
}
console.log(decoded);

Cette commande décode la charge utile du JWT sans vérifier la signature du token. Utilisez un décodeur local pour les tokens de production et évitez de les coller dans des outils tiers.

Une fois décodé, un token d’identité du serveur de métadonnées Google ressemble à ceci :

{
  "iss": "https://accounts.google.com",
  "aud": "https://api.openai.com/v1",
  "azp": "110123456789012345678",
  "sub": "110123456789012345678",
  "email": "openai-wif@my-project.iam.gserviceaccount.com",
  "email_verified": true,
  "iat": 1716235422,
  "exp": 1716239022
}

Utilisez la charge utile décodée pour comparer le token reçu aux valeurs d’émetteur, d’audience et de mappage configurées dans OpenAI. La plupart des problèmes de configuration sont visibles dans les revendications iss, aud, email et sub avant l’échange du token.

Configuration de la fédération d’identités de charge de travail

Créez un fournisseur d’identité de charge de travail dans OpenAI pour les tokens d’identité émis par Google, puis ajoutez un mappage de compte de service fondé sur les revendications stables du token.

Configurez d’abord le fournisseur d’identité de charge de travail, puis créez le mappage de compte de service.

Configurez le fournisseur d’identité de charge de travail

  1. Créez le fournisseur d’identité de charge de travail. Définissez une valeur unique pour Nom , par exemple google-workload-identity-prod. Renseignez le champ Description, par exemple avec Production Google Cloud workloads, pour aider les administrateurs à identifier le fournisseur.

  2. Définissez l’émetteur et l’audience. Définissez URL de l’émetteur OIDC sur https://accounts.google.com. Définissez Audience sur l’audience personnalisée que votre charge de travail demande au serveur de métadonnées Google, par exemple https://api.openai.com/v1. Cette valeur doit correspondre à la revendication aud du token.

  3. Utilisez la découverte OIDC de Google. Laissez l’option Utiliser les JWKS importés pour vérifier les tokens désactivée. OpenAI utilise les métadonnées de découverte OIDC et les JWKS de Google pour vérifier le token d’identité signé par Google.

  4. Ajoutez des transformations d’attributs si vous avez besoin d’attributs dérivés pour le mappage. Par exemple, saisissez subject avec l’expression assertion.sub pour créer openai.subject à partir de la revendication de sujet. Le tableau de bord applique automatiquement le préfixe openai.. Les revendications brutes du token qui commencent déjà par openai. sont ignorées pour les clés de mappage openai., sauf si une transformation correspondante est configurée.

Configurez le mappage de compte de service

  1. Créez un mappage de compte de service. Définissez pour Nom une valeur unique au sein du fournisseur d’identité de charge de travail, par exemple compute-openai-wif. Renseignez le champ Description, par exemple avec Production Compute Engine OpenAI API workload, pour préciser quelle charge de travail peut utiliser ce mappage.

  2. Établissez la correspondance avec les revendications stables du compte de service Google. Ajoutez une ligne Clé et Valeur pour chaque revendication devant correspondre. Utilisez sub comme lien principal avec l’identité, car cette valeur est stable et unique. Vous pouvez également ajouter une correspondance sur email pour faciliter la lecture.

  3. Choisissez la cible OpenAI. Définissez Projet sur le projet OpenAI auquel appartient le compte de service cible. Définissez Compte de service sur le compte de service OpenAI que la charge de travail Google Cloud peut utiliser, par exemple google-workload-identity-prod-openai-wif.

  4. Limitez les autorisations de l’API si nécessaire. Sélectionnez les Autorisations appropriées, telles que api.model.request et api.vector_store.read, pour restreindre davantage les droits des jetons d’accès émis à partir de ce mappage. Laissez les autorisations vides pour ne pas ajouter de restriction de portée propre à WIF ; le token confère toujours les droits du compte de service associé par le mappage.

Utilisation du token dans le code

Configurez votre client du SDK OpenAI pour demander un token d’identité Google au serveur de métadonnées et l’échanger contre un jeton d’accès émis par OpenAI.

Définissez OPENAI_WIF_AUDIENCE sur l’audience personnalisée configurée pour le fournisseur d’identité de charge de travail. Le SDK demande un token d’identité Google pour cette audience, l’échange contre un jeton d’accès émis par OpenAI, puis utilise le token OpenAI pour authentifier les requêtes API.

Authentification à partir d’un token d’identité du serveur de métadonnées Google
import OpenAI from "openai";

const metadataEndpoint =
  "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity";

const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;
const audience = process.env.OPENAI_WIF_AUDIENCE;

if (!identityProviderId || !serviceAccountId || !audience) {
  throw new Error(
    "Set OPENAI_IDENTITY_PROVIDER_ID, OPENAI_SERVICE_ACCOUNT_ID, and OPENAI_WIF_AUDIENCE"
  );
}

function googleMetadataIdentityTokenProvider(audience) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const url = new URL(metadataEndpoint);
      url.searchParams.set("audience", audience);
      url.searchParams.set("format", "full");

      const response = await fetch(url, {
        headers: { "Metadata-Flavor": "Google" },
      });

      if (!response.ok) {
        throw new Error(
          `Google metadata token request failed with status ${response.status}.`
        );
      }

      const token = (await response.text()).trim();
      if (!token) {
        throw new Error(
          "Google metadata server did not return an identity token."
        );
      }

      return token;
    },
  };
}

const client = new OpenAI({
  workloadIdentity: {
    identityProviderId,
    serviceAccountId,
    provider: googleMetadataIdentityTokenProvider(audience),
  },
});

const response = await client.responses.create({
  model: "gpt-5.6-terra",
  input: "Say hello from Google Cloud workload identity federation.",
});

console.log(response.output_text);

Bonnes pratiques pour Google Cloud

  • Utilisez des comptes de service Google dédiés à chaque charge de travail. Évitez de partager des comptes de service entre des services ou des environnements sans lien entre eux.
  • Utilisez des mécanismes d’authentification par identité de charge de travail plutôt que des clés de compte de service à longue durée de vie. Évitez de distribuer des fichiers de clés JSON et d’en assurer la rotation pour les charges de travail qui peuvent utiliser les tokens d’identité du serveur de métadonnées ou GKE Workload Identity.
  • Limitez la portée des identités au périmètre de charge de travail le plus restreint possible en pratique. Des comptes de service distincts pour chaque application facilitent l’audit et permettent d’appliquer le principe du moindre privilège aux accès.
  • Utilisez les correspondances fondées sur des attributs avec précaution. Dans la mesure du possible, privilégiez des identifiants stables, comme les revendications de sujet des comptes de service, plutôt que des métadonnées susceptibles de changer.
  • Séparez les projets de production des projets hors production. Des projets distincts réduisent le risque de partage accidentel de privilèges et simplifient l’audit.
  • Accordez uniquement les autorisations IAM nécessaires. Limitez les autorisations de l’identité Google à celles requises par la charge de travail.
  • Surveillez l’utilisation des comptes de service. Des échanges de tokens inattendus peuvent signaler une dérive de configuration ou une compromission des charges de travail.