For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal

Configuração da federação de identidades de cargas de trabalho para o Google Cloud

Use o Google Cloud como provedor de identidade de cargas de trabalho em qualquer um destes cenários:

  • Identidade de cargas de trabalho do Google: Troque um token OIDC assinado pelo Google e emitido para uma conta de serviço do Google anexada ao recurso por um token de acesso da OpenAI de curta duração.
  • Google Kubernetes Engine: Troque um token projetado de conta de serviço do GKE por um token de acesso da OpenAI de curta duração.

Para o Codex, use esta página para obter e inspecionar o token do Google. Em seguida, configure a identidade de cargas de trabalho do Codex para gravar esse token em um arquivo e indicar esse arquivo ao Codex. O mapeamento de contas de serviço e os exemplos de SDK desta página se aplicam à API da OpenAI.

Identidade de cargas de trabalho do Google

As cargas de trabalho do Google Cloud podem solicitar tokens de identidade OIDC assinados ao servidor de metadados do Google sem armazenar chaves de conta de serviço de longa duração. Na federação de identidades de cargas de trabalho da OpenAI, o token de identidade do Google é o token de sujeito que a OpenAI valida antes de emitir um token de acesso da OpenAI. Esse fluxo funciona no Compute Engine, no Cloud Run, em cargas de trabalho do GKE que usam contas de serviço do Google anexadas e em outros ambientes de execução gerenciados pelo Google que expõem o endpoint de identidade do servidor de metadados.

Configuração da identidade de cargas de trabalho do Google

Crie uma conta de serviço do Google para a carga de trabalho que precisa chamar a API da OpenAI. Para ver o fluxo completo de configuração, consulte o guia do Google para criar contas de serviço.

Por exemplo, crie uma conta de serviço com a CLI do Google Cloud:

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

Crie a VM do Compute Engine com a conta de serviço anexada ou anexe a conta de serviço ao recurso do Google Cloud que executa seu aplicativo. O recurso precisa conseguir chamar o servidor de metadados do Google durante a execução. Para obter detalhes sobre a configuração da VM, consulte o guia do Google para criar uma VM que usa uma conta de serviço gerenciada pelo usuário.

Não crie nem baixe chaves de conta de serviço para esse fluxo. A carga de trabalho usa a conta de serviço anexada e o servidor de metadados para solicitar um token OIDC de curta duração.

Obtenção de um token de identidade do Google

No recurso do Google Cloud com a conta de serviço anexada, solicite ao servidor de metadados um token de identidade OIDC com o público-alvo configurado. Esse é o token de sujeito que a OpenAI troca por um token de acesso emitido pela 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

O servidor de metadados retorna um JWT assinado pelo Google. Para obter mais informações sobre o endpoint de identidade do servidor de metadados, consulte o guia do Google para verificar a identidade da VM.

Verifique o token

Antes de configurar a federação de identidades de cargas de trabalho, exporte o token de identidade do Google como TOKEN e execute este script localmente para inspecionar suas declarações:

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 o payload do JWT sem verificar a assinatura do token. Use um decodificador local para tokens de produção e evite colar tokens de produção em ferramentas de terceiros.

Um token de identidade decodificado do servidor de metadados do Google terá uma estrutura semelhante a esta:

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

Use o payload decodificado para comparar o token recebido com os valores de emissor, público-alvo e mapeamento configurados na OpenAI. A maioria dos problemas de configuração pode ser identificada nas declarações iss, aud, email e sub antes de trocar o token.

Configuração da federação de identidades de cargas de trabalho

Crie um provedor de identidade de cargas de trabalho na OpenAI para tokens de identidade emitidos pelo Google. Em seguida, adicione um mapeamento de conta de serviço que corresponda a declarações estáveis do token.

Primeiro, configure o provedor de identidade de cargas de trabalho. Em seguida, crie o mapeamento de conta de serviço.

Configure o provedor de identidade de cargas de trabalho

  1. Crie o provedor de identidade de cargas de trabalho. Defina Nome como um valor exclusivo, como google-workload-identity-prod. Use Descrição, por exemplo, Production Google Cloud workloads, para ajudar os administradores a identificar o provedor.

  2. Defina o emissor e o público-alvo. Defina URL do emissor OIDC como https://accounts.google.com. Defina Público-alvo como o público-alvo personalizado que sua carga de trabalho solicita ao servidor de metadados do Google, como https://api.openai.com/v1. Esse valor deve corresponder à declaração aud do token.

  3. Use a descoberta OIDC do Google. Mantenha a opção Usar JWKS enviado para verificação de tokens desativada. A OpenAI usa os metadados de descoberta OIDC e o JWKS do Google para verificar o token de identidade assinado pelo Google.

  4. Adicione transformações de atributos se precisar de atributos de mapeamento derivados. Por exemplo, insira subject com a expressão assertion.sub para criar openai.subject a partir da declaração de sujeito. O painel aplica o prefixo openai. automaticamente. As declarações brutas do token que já começam com openai. são ignoradas nas chaves de mapeamento openai., a menos que uma transformação correspondente esteja configurada.

Configure o mapeamento de conta de serviço

  1. Crie um mapeamento de conta de serviço. Defina Nome como um valor exclusivo dentro do provedor de identidade de cargas de trabalho, como compute-openai-wif. Use Descrição, por exemplo, Production Compute Engine OpenAI API workload, para explicar qual carga de trabalho pode usar o mapeamento.

  2. Exija correspondência com declarações estáveis da conta de serviço do Google. Adicione uma linha de Chave e Valor para cada declaração que deve corresponder. Use sub como vínculo principal de identidade, pois é estável e exclusivo. Você também pode exigir correspondência com email para facilitar a leitura.

  3. Escolha o destino na OpenAI. Defina Projeto como o projeto da OpenAI ao qual pertence a conta de serviço de destino. Defina Conta de serviço como a conta de serviço da OpenAI que a carga de trabalho do Google Cloud pode usar, como google-workload-identity-prod-openai-wif.

  4. Restrinja as permissões da API, se necessário. Selecione as Permissões adequadas, como api.model.request e api.vector_store.read, para restringir ainda mais os tokens de acesso emitidos a partir desse mapeamento. Deixe as permissões em branco para não adicionar uma restrição de escopo específica de WIF; o token ainda concede autorização como a conta de serviço mapeada.

Uso do token no código

Configure seu cliente do OpenAI SDK para solicitar um token de identidade do Google ao servidor de metadados e trocá-lo por um token de acesso emitido pela OpenAI.

Defina OPENAI_WIF_AUDIENCE como o público-alvo personalizado configurado como público-alvo do provedor de identidade de cargas de trabalho. O SDK solicita um token de identidade do Google para esse público-alvo, troca-o por um token de acesso emitido pela OpenAI e usa o token da OpenAI para autenticar as solicitações à API.

Autentique-se com um token de identidade do servidor de metadados do 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áticas recomendadas para o Google Cloud

  • Use contas de serviço do Google dedicadas a cada carga de trabalho. Evite compartilhar contas de serviço entre serviços ou ambientes sem relação entre si.
  • Use fluxos de identidade de cargas de trabalho em vez de chaves de conta de serviço de longa duração. Evite distribuir e rotacionar arquivos de chave JSON para cargas de trabalho que podem usar tokens de identidade do servidor de metadados ou a identidade de cargas de trabalho do GKE.
  • Restrinja o escopo das identidades ao menor limite viável da carga de trabalho. Contas de serviço separadas para cada aplicativo proporcionam auditorias mais claras e acesso com privilégio mínimo.
  • Use mapeamentos baseados em atributos com cuidado. Sempre que possível, prefira identificadores estáveis, como declarações de sujeito de contas de serviço, a metadados mutáveis.
  • Separe os projetos de produção dos projetos de outros ambientes. Projetos distintos reduzem o risco de compartilhamento acidental de privilégios e simplificam a auditoria.
  • Conceda apenas as permissões de IAM necessárias. Restrinja a identidade do Google às permissões exigidas pela carga de trabalho.
  • Monitore o uso das contas de serviço. Trocas inesperadas de tokens podem indicar desvios de configuração ou cargas de trabalho comprometidas.