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
Theme

Como configurar a federação de identidades de carga de trabalho para o Google Cloud

Use o Google Cloud como provedor de identidade de carga de trabalho em um dos seguintes cenários:

  • Identidade de carga de trabalho do Google: troque um token OIDC assinado pelo Google e emitido para uma conta de serviço do Google vinculada à carga de trabalho por um token de acesso de curta duração da OpenAI.
  • Google Kubernetes Engine: troque um token projetado de conta de serviço do GKE por um token de acesso de curta duração da OpenAI.

Identidade de carga 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 precisar armazenar chaves de conta de serviço de longa duração. Na federação de identidades de carga de trabalho da OpenAI, o token de identidade do Google serve como token de sujeito, que a OpenAI valida antes de emitir um token de acesso. Esse fluxo funciona no Compute Engine, no Cloud Run, em cargas de trabalho do GKE com contas de serviço do Google vinculadas e em outros ambientes de execução gerenciados pelo Google que disponibilizam o endpoint de identidade do servidor de metadados.

Configure a identidade de carga 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 todas as etapas de configuração, consulte o guia do Google sobre como 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 já com a conta de serviço vinculada ou vincule a conta ao recurso do Google Cloud que executa seu aplicativo. O recurso precisa conseguir acessar o servidor de metadados do Google durante a execução. Para mais detalhes sobre a configuração da VM, consulte o guia do Google sobre como 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 vinculada e o servidor de metadados para solicitar um token OIDC de curta duração.

Obtenha um token de identidade do Google

No recurso do Google Cloud ao qual a conta de serviço está vinculada, 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 própria 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 saber mais sobre o endpoint de identidade do servidor de metadados, consulte o guia do Google sobre como verificar a identidade de uma VM.

Verifique o token

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

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

Esse comando decodifica o conteúdo do JWT sem verificar a assinatura do token. Use um decodificador local para tokens de produção e evite colá-los em ferramentas de terceiros.

Depois de decodificado, um token de identidade do servidor de metadados do Google terá conteúdo semelhante a este:

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

Compare o conteúdo decodificado do token recebido com o emissor, o público-alvo e os valores de mapeamento configurados na OpenAI. Antes de trocar o token, você pode identificar a maioria dos problemas de configuração nas declarações iss, aud, email e sub.

Configure a federação de identidades de carga de trabalho

Crie na OpenAI um provedor de identidade de carga de trabalho para os tokens de identidade emitidos pelo Google. Em seguida, adicione um mapeamento de conta de serviço com base em declarações estáveis do token.

Configure primeiro o provedor de identidade de carga de trabalho e depois crie o mapeamento de conta de serviço.

Configure o provedor de identidade de carga de trabalho

  1. Crie o provedor de identidade de carga de trabalho. Em Nome, insira um valor exclusivo, como google-workload-identity-prod. Em Descrição, insira um texto como Production Google Cloud workloads para ajudar os administradores a identificar o provedor.

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

  3. Use a descoberta OIDC do Google. Mantenha desativada a opção Usar o JWKS carregado para verificar tokens. 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 derivados para o mapeamento. 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. Se uma declaração original do token já começar com openai., ela será ignorada nas chaves de mapeamento com o prefixo openai., a menos que você configure uma transformação correspondente.

Configure o mapeamento de conta de serviço

  1. Crie um mapeamento de conta de serviço. Em Nome, insira um valor exclusivo no provedor de identidade de carga de trabalho, como compute-openai-wif. Em Descrição, insira um texto como Production Compute Engine OpenAI API workload para indicar qual carga de trabalho pode usar o mapeamento.

  2. Use declarações estáveis para identificar a conta de serviço do Google. Adicione uma linha com Chave e Valor para cada declaração que precisa corresponder ao valor configurado. Use sub como identificador principal para vincular a identidade, pois seu valor é estável e exclusivo. Para facilitar a leitura, você também pode incluir email na correspondência.

  3. Escolha o destino na OpenAI. Em Projeto, selecione o projeto da OpenAI ao qual pertence a conta de serviço de destino. Em Conta de serviço, selecione 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. Em Permissões, selecione as permissões adequadas, como api.model.request e api.vector_store.read, para restringir ainda mais o acesso concedido pelos tokens emitidos com esse mapeamento. Deixe as permissões em branco para evitar uma restrição de escopo específica da WIF. Nesse caso, o token continua a autorizar o acesso com as permissões da conta de serviço mapeada.

Use o token no código

Configure o cliente do SDK da OpenAI 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 com o público-alvo personalizado configurado no provedor de identidade de carga 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.

Autenticação 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);

Boas práticas para o Google Cloud

  • Use uma conta de serviço do Google dedicada 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 carga de trabalho em vez de chaves de conta de serviço de longa duração. Evite distribuir arquivos de chave JSON e fazer a rotação dessas chaves para cargas de trabalho que possam usar tokens de identidade do servidor de metadados ou o GKE Workload Identity.
  • Limite o escopo de cada identidade à menor parte da carga de trabalho que seja viável isolar. Usar uma conta de serviço separada para cada aplicativo facilita a auditoria e permite conceder acesso com o mínimo de privilégios.
  • Use mapeamentos baseados em atributos com cuidado. Sempre que possível, prefira identificadores estáveis, como a declaração de sujeito da conta de serviço, a metadados que podem mudar.
  • Separe os projetos de produção dos demais projetos. Essa separação reduz o risco de compartilhar privilégios por engano e simplifica a auditoria.
  • Conceda apenas as permissões de IAM necessárias. Limite as permissões da identidade do Google às que a carga de trabalho exige.
  • Monitore o uso das contas de serviço. Trocas inesperadas de tokens podem indicar desvios na configuração ou cargas de trabalho comprometidas.