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

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

Utilisez Google Cloud comme fournisseur d’identités de charge de travail dans l’un des deux cas suivants :

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

Identité de charge de travail Google

Les charges de travail Google Cloud peuvent demander des jetons 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 jeton d’identité Google sert de jeton du sujet. OpenAI le valide avant d’émettre un jeton d’accès OpenAI. Ce mécanisme fonctionne sur Compute Engine et Cloud Run, pour les charges de travail GKE qui utilisent un compte de service Google associé, ainsi que dans les autres environnements d’exécution gérés par Google qui donnent accès au 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 toutes les étapes de configuration, 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"

Associez le compte de service à la VM Compute Engine lors de sa création ou à 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 qui utilise 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 cette procédure. La charge de travail utilise le compte de service associé pour demander un jeton OIDC de courte durée au serveur de métadonnées.

Obtention d’un jeton d’identité Google

Depuis la ressource Google Cloud à laquelle le compte de service est associé, demandez au serveur de métadonnées un jeton d’identité OIDC pour l’audience configurée. Ce jeton sert de jeton du sujet. En échange, OpenAI émet un jeton d’accès.

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érification du jeton

Avant de configurer la fédération d’identités de charge de travail, exportez le jeton 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 jeton. Pour les jetons de production, utilisez un décodeur local et évitez de les coller dans des outils tiers.

Voici un exemple de jeton d’identité décodé provenant du serveur de métadonnées Google :

{
  "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
}

Comparez l’émetteur, l’audience et les valeurs de correspondance du jeton décodé avec ceux que vous avez configurés dans OpenAI. L’examen des revendications iss, aud, email et sub permet de repérer la plupart des problèmes de configuration avant d’échanger le jeton.

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

Dans OpenAI, créez un fournisseur d’identités de charge de travail pour les jetons d’identité émis par Google. Ajoutez ensuite une correspondance de compte de service fondée sur des revendications stables du jeton.

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

Configuration du fournisseur d’identités de charge de travail

  1. Créez le fournisseur d’identités de charge de travail. Dans le champ Nom, saisissez une valeur unique, par exemple google-workload-identity-prod. Dans le champ Description, saisissez un texte qui permet aux administrateurs d’identifier le fournisseur, par exemple Production Google Cloud workloads.

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

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

  4. Ajoutez des transformations si la correspondance nécessite des attributs dérivés. Par exemple, saisissez subject et l’expression assertion.sub pour créer openai.subject à partir de la revendication du sujet. Le tableau de bord ajoute automatiquement le préfixe openai.. Les revendications brutes du jeton qui commencent déjà par openai. ne sont prises en compte pour les clés de correspondance commençant par openai. que si vous configurez une transformation correspondante.

Configuration de la correspondance de compte de service

  1. Créez une correspondance de compte de service. Dans le champ Nom, saisissez une valeur unique au sein du fournisseur d’identités de charge de travail, par exemple compute-openai-wif. Dans le champ Description, indiquez quelle charge de travail peut utiliser la correspondance, par exemple Production Compute Engine OpenAI API workload.

  2. Établissez la correspondance à partir de revendications stables du compte de service Google. Pour chaque revendication à vérifier, ajoutez une ligne et renseignez les champs Clé et Valeur. Utilisez sub comme identifiant principal, car sa valeur est stable et unique. Pour faciliter la lecture, vous pouvez aussi inclure email dans la correspondance.

  3. Choisissez la cible OpenAI. Dans le champ Projet, sélectionnez le projet OpenAI auquel appartient le compte de service cible. Dans le champ Compte de service, sélectionnez 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. Dans Autorisations, sélectionnez les autorisations appropriées, par exemple api.model.request et api.vector_store.read, pour limiter davantage les droits accordés par les jetons d’accès émis à partir de cette correspondance. Laissez ce champ vide pour éviter d’ajouter une restriction de portée propre à la fédération d’identités de charge de travail. Le jeton donne alors accès à l’API avec les droits du compte de service associé.

Utilisation du jeton dans le code

Configurez le client du SDK OpenAI pour qu’il demande un jeton d’identité Google au serveur de métadonnées et l’échange contre un jeton d’accès émis par OpenAI.

Attribuez à OPENAI_WIF_AUDIENCE la valeur de l’audience personnalisée configurée pour le fournisseur d’identités de charge de travail. Le SDK demande un jeton d’identité Google pour cette audience, l’échange contre un jeton d’accès émis par OpenAI et utilise ce dernier pour authentifier les requêtes à l’API.

Authentification avec un jeton 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 un compte de service Google dédié à chaque charge de travail. Évitez de partager un compte de service entre des services ou des environnements sans lien entre eux.
  • Utilisez l’identité de charge de travail plutôt que des clés de compte de service de longue durée. Évitez de distribuer et de renouveler des fichiers de clés JSON pour les charges de travail qui peuvent utiliser les jetons d’identité du serveur de métadonnées ou GKE Workload Identity.
  • Limitez chaque identité au périmètre de charge de travail le plus restreint possible en pratique. Des comptes de service distincts pour chaque application facilitent les audits et permettent d’appliquer le principe du moindre privilège.
  • Choisissez avec soin les attributs qui servent à établir les correspondances. Dans la mesure du possible, privilégiez les identifiants stables, comme les revendications de sujet des comptes de service, plutôt que les métadonnées susceptibles de changer.
  • Séparez les projets de production des autres projets. Des projets distincts réduisent le risque de partage accidentel de privilèges et simplifient les audits.
  • Accordez uniquement les autorisations IAM nécessaires. Limitez les autorisations de l’identité Google à celles dont la charge de travail a besoin.
  • Surveillez l’utilisation des comptes de service. Des échanges de jetons inattendus peuvent signaler un écart par rapport à la configuration prévue ou la compromission de charges de travail.