For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Configurar la federación de identidades de cargas de trabajo para Google Cloud

Usa Google Cloud como proveedor de identidades de cargas de trabajo en cualquiera de estos casos:

  • Identidad de cargas de trabajo de Google: intercambia un token OIDC que Google firma y emite para una cuenta de servicio de Google asociada al recurso por un token de acceso de OpenAI de corta duración.
  • Google Kubernetes Engine: intercambia un token proyectado de una cuenta de servicio de GKE por un token de acceso de OpenAI de corta duración.

Identidad de cargas de trabajo de Google

Las cargas de trabajo de Google Cloud pueden solicitar tokens de identidad OIDC firmados al servidor de metadatos de Google sin almacenar claves de cuenta de servicio de larga duración. En la federación de identidades de cargas de trabajo de OpenAI, el token de identidad de Google es el token de sujeto que OpenAI valida antes de emitir un token de acceso de OpenAI. Este flujo funciona en Compute Engine, en Cloud Run, en cargas de trabajo de GKE que usan cuentas de servicio de Google asociadas y en otros entornos de ejecución administrados por Google que ofrecen el punto de acceso de identidad del servidor de metadatos.

Configurar la identidad de cargas de trabajo de Google

Crea una cuenta de servicio de Google para la carga de trabajo que necesita llamar a la API de OpenAI. Para ver todos los pasos de configuración, consulta la guía de Google para crear cuentas de servicio.

Por ejemplo, crea una cuenta de servicio con la CLI de Google Cloud:

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

Crea la VM de Compute Engine con la cuenta de servicio asociada o asocia la cuenta de servicio al recurso de Google Cloud que ejecuta tu aplicación. El recurso debe poder llamar al servidor de metadatos de Google en tiempo de ejecución. Para obtener más información sobre la configuración de la VM, consulta la guía de Google para crear una VM que use una cuenta de servicio administrada por el usuario.

No crees ni descargues claves de cuenta de servicio para este flujo. La carga de trabajo usa la cuenta de servicio asociada y el servidor de metadatos para solicitar un token OIDC de corta duración.

Obtener un token de identidad de Google

Desde el recurso de Google Cloud que tiene asociada la cuenta de servicio, solicita al servidor de metadatos un token de identidad OIDC con la audiencia configurada. Este es el token de sujeto que OpenAI intercambia por un token de acceso emitido por 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

El servidor de metadatos devuelve un JWT firmado por Google. Para obtener más información sobre el punto de acceso de identidad del servidor de metadatos, consulta la guía de Google para verificar la identidad de una VM.

Verificar el token

Antes de configurar la federación de identidades de cargas de trabajo, exporta el token de identidad de Google como TOKEN y ejecuta este script localmente para examinar sus declaraciones:

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);

Este comando decodifica el contenido del JWT sin verificar la firma del token. Usa un decodificador local para los tokens de producción y evita pegarlos en herramientas de terceros.

Una vez decodificado, un token de identidad del servidor de metadatos de Google se parece al de este ejemplo:

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

Usa el contenido decodificado para comparar los datos del token que recibiste con el emisor, la audiencia y los valores de asignación configurados en OpenAI. Antes de intercambiar el token, puedes detectar la mayoría de los problemas de configuración en las declaraciones iss, aud, email y sub.

Configurar la federación de identidades de cargas de trabajo

Crea un proveedor de identidades de cargas de trabajo en OpenAI para los tokens de identidad emitidos por Google. Luego, agrega una asignación de cuenta de servicio que coincida con declaraciones estables del token.

Configura primero el proveedor de identidades de cargas de trabajo y luego crea la asignación de cuenta de servicio.

Configurar el proveedor de identidades de cargas de trabajo

  1. Crea el proveedor de identidades de cargas de trabajo. En Nombre, ingresa un valor único, como google-workload-identity-prod. En Descripción, ingresa un texto que ayude a los administradores a identificar el proveedor, como Production Google Cloud workloads.

  2. Configura el emisor y la audiencia. En URL del emisor OIDC, ingresa https://accounts.google.com. En Audiencia, ingresa la audiencia personalizada que tu carga de trabajo solicita al servidor de metadatos de Google, como https://api.openai.com/v1. Este valor debe coincidir con la declaración aud del token.

  3. Usa el descubrimiento OIDC de Google. Deja desactivada la opción Usar el JWKS cargado para verificar los tokens. OpenAI usa los metadatos de descubrimiento OIDC y el JWKS de Google para verificar el token de identidad firmado por Google.

  4. Agrega transformaciones de atributos si necesitas atributos derivados para la asignación. Por ejemplo, ingresa subject con la expresión assertion.sub para crear openai.subject a partir de la declaración del sujeto. El panel aplica el prefijo openai. automáticamente. Si no configuras la transformación correspondiente, se omiten las declaraciones originales del token que ya empiezan con openai. al evaluar las claves de asignación con el prefijo openai..

Configurar la asignación de cuenta de servicio

  1. Crea una asignación de cuenta de servicio. En Nombre, ingresa un valor único dentro del proveedor de identidades de cargas de trabajo, como compute-openai-wif. En Descripción, indica qué carga de trabajo puede usar la asignación, por ejemplo, Production Compute Engine OpenAI API workload.

  2. Usa declaraciones estables de la cuenta de servicio de Google como criterios de coincidencia. Agrega una fila con una Clave y un Valor por cada declaración que deba coincidir. Usa sub como identificador principal para vincular la identidad, ya que es estable y único. Para facilitar la lectura, también puedes incluir email como criterio de coincidencia.

  3. Elige el destino en OpenAI. En Proyecto, selecciona el proyecto de OpenAI al que pertenece la cuenta de servicio de destino. En Cuenta de servicio, selecciona la cuenta de servicio de OpenAI que puede usar la carga de trabajo de Google Cloud, como google-workload-identity-prod-openai-wif.

  4. Limita los permisos de la API si es necesario. Selecciona los Permisos adecuados, como api.model.request y api.vector_store.read, para limitar aún más el alcance de los tokens de acceso emitidos a partir de esta asignación. Deja los permisos en blanco si quieres evitar una restricción de alcance específica de WIF. El token seguirá autorizando las solicitudes con los permisos de la cuenta de servicio asignada.

Usar el token en el código

Configura tu cliente del SDK de OpenAI para que solicite un token de identidad de Google al servidor de metadatos y lo intercambie por un token de acceso emitido por OpenAI.

Asigna a OPENAI_WIF_AUDIENCE la audiencia personalizada que configuraste en el proveedor de identidades de cargas de trabajo. El SDK solicita un token de identidad de Google para esa audiencia, lo intercambia por un token de acceso emitido por OpenAI y usa el token de OpenAI para autenticar las solicitudes a la API.

Autenticación con un token de identidad del servidor de metadatos de 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);

Prácticas recomendadas para Google Cloud

  • Usa una cuenta de servicio de Google exclusiva para cada carga de trabajo. Evita compartir cuentas de servicio entre servicios o entornos que no estén relacionados.
  • Usa flujos de identidad de cargas de trabajo en lugar de claves de cuenta de servicio de larga duración. Evita distribuir y rotar archivos de claves JSON para cargas de trabajo que puedan usar tokens de identidad del servidor de metadatos o GKE Workload Identity.
  • Limita el alcance de cada identidad al conjunto más pequeño de cargas de trabajo que resulte práctico. Usar una cuenta de servicio distinta para cada aplicación facilita las auditorías y permite aplicar el principio de mínimo privilegio.
  • Usa con cuidado las asignaciones basadas en atributos. Siempre que sea posible, prefiere identificadores estables, como las declaraciones de sujeto de las cuentas de servicio, a los metadatos que pueden cambiar.
  • Separa los proyectos de producción de los demás proyectos. Usar proyectos distintos reduce el riesgo de compartir privilegios por accidente y simplifica las auditorías.
  • Otorga solo los permisos de IAM necesarios. Limita los permisos de la identidad de Google a los que necesita la carga de trabajo.
  • Monitorea el uso de las cuentas de servicio. Los intercambios de tokens inesperados pueden indicar que la configuración se ha desviado de lo previsto o que alguna carga de trabajo se ha visto comprometida.