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 Microsoft Azure

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

  • Identidade gerenciada do Azure: Troque um token de acesso do Microsoft Entra ID emitido para uma identidade gerenciada por um token de acesso da OpenAI de curta duração.
  • AKS: Troque um token projetado de conta de serviço do Azure Kubernetes Service (AKS) 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 Microsoft Entra. 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 conta de serviço e os exemplos de SDK desta página se aplicam à API da OpenAI.

Identidade gerenciada do Azure

As identidades gerenciadas do Azure permitem que cargas de trabalho hospedadas no Azure solicitem tokens do Microsoft Entra sem armazenar segredos de longa duração. Na federação de identidades de cargas de trabalho da OpenAI, o token da identidade gerenciada é o token de sujeito que a OpenAI valida antes de emitir um token de acesso da OpenAI.

Configuração da identidade gerenciada do Azure

Crie ou use um registro de aplicativo do Microsoft Entra que represente o público-alvo do token no qual a OpenAI deve confiar. Configure seu URI da ID do aplicativo; esse URI é o valor de resource que sua carga de trabalho solicita ao Azure Instance Metadata Service (IMDS) e aparece como a declaração aud no token emitido. Para ver as etapas de configuração da Microsoft, consulte o guia do Microsoft Entra para criar um aplicativo do Entra ID e uma entidade de serviço.

O URI da ID do aplicativo configurado no Microsoft Entra ID, o parâmetro resource do IMDS, a declaração aud do token resultante e o público-alvo do provedor de identidade de cargas de trabalho da OpenAI devem ter o mesmo valor.

Crie uma identidade gerenciada e atribua essa identidade ao recurso do Azure que executa seu aplicativo, como uma máquina virtual. O recurso deve ser capaz de chamar o IMDS em tempo de execução. Para obter detalhes sobre a configuração do Azure, consulte a visão geral das identidades gerenciadas da Microsoft e a documentação do recurso do Azure correspondente sobre como atribuir a identidade.

Obtenção de um token de identidade gerenciada do Azure

No recurso do Azure ao qual a identidade gerenciada foi atribuída, solicite um token ao IMDS usando o URI da ID do aplicativo como parâmetro resource. Esse é o token de sujeito que a OpenAI troca por um token de acesso emitido pela OpenAI.

APPLICATION_ID_URI="api://<application-client-id>"

TOKEN=$(curl -sS -G -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token" \
  --data-urlencode "api-version=2018-02-01" \
  --data-urlencode "resource=${APPLICATION_ID_URI}" \
  | jq -r .access_token)
export TOKEN

Se o recurso tiver várias identidades gerenciadas atribuídas pelo usuário, adicione o parâmetro de consulta client_id, object_id ou msi_res_id da identidade gerenciada que você quer usar. A Microsoft documenta os parâmetros de solicitação de token do IMDS em Usar identidades gerenciadas em uma máquina virtual para obter um token de acesso.

Verifique o token

Antes de configurar a federação de identidades de cargas de trabalho, exporte o token do Microsoft Entra 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 gerenciada do Microsoft Entra ID decodificado será semelhante a:

{
  "iss": "https://login.microsoftonline.com/11111111-2222-3333-4444-555555555555/v2.0",
  "aud": "api://00000000-1111-2222-3333-444444444444",
  "tid": "11111111-2222-3333-4444-555555555555",
  "appid": "22222222-3333-4444-5555-666666666666",
  "oid": "33333333-4444-5555-6666-777777777777",
  "sub": "33333333-4444-5555-6666-777777777777",
  "xms_mirid": "/subscriptions/<subscription-id>/resourcegroups/my-resource-group/providers/Microsoft.Compute/virtualMachines/openai-wif-vm",
  "iat": 1716235422,
  "exp": 1716239022
}

Verifique as declarações que você pretende configurar na OpenAI:

  • iss: use o valor exato do emissor presente no token. O emissor pode ser https://login.microsoftonline.com/<tenant-id>/v2.0, mas não presuma esse sufixo.
  • aud: deve corresponder ao URI da ID do aplicativo, ao parâmetro resource do IMDS e ao público-alvo do provedor de identidade de cargas de trabalho da OpenAI.
  • tid: a ID do locatário do Microsoft Entra.
  • appid: a ID do aplicativo/cliente da identidade gerenciada, quando presente.
  • iat e exp: verifique o tempo de vida total do token, exp - iat, em segundos.

Para o Codex, defina max_assertion_lifetime_seconds do provedor como um limite aprovado que cubra a faixa esperada de tempos de vida dos tokens do emissor. Não use a validade restante do token nem presuma que todo token do Entra dura uma hora. A Microsoft documenta tempos de vida variáveis dos tokens de acesso e não oferece suporte à configuração dos tempos de vida dos tokens de identidade gerenciada. Consulte o exemplo de provedor da API de administração.

Os tokens de identidade gerenciada também podem conter declarações como azp, oid, sub ou xms_mirid. Use o token decodificado como fonte de verdade e escolha declarações que identifiquem exatamente a identidade gerenciada e o limite de recursos nos quais você confia.

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, tid e de identidade gerenciada antes de você 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 o emissor do Microsoft Entra ID e adicione um mapeamento de conta de serviço que corresponda a declarações estáveis do token de identidade gerenciada.

Configure primeiro o provedor de identidade de cargas de trabalho e depois 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 único, como azure-managed-identity-prod. Preencha Descrição com um texto como Production Azure managed identity workloads para ajudar os administradores a identificar o provedor.

  2. Defina o emissor e o público-alvo. Defina URL do emissor OIDC como o valor exato da declaração iss do token. Primeiro, obtenha um token de identidade gerenciada de exemplo e inspecione suas declarações. Por exemplo, o emissor pode ser https://login.microsoftonline.com/<tenant-id>/v2.0. Defina Público-alvo como o URI da ID do aplicativo do Microsoft Entra que você configurou, como api://<application-client-id>. Esse valor deve corresponder à declaração aud do token.

  3. Use a verificação de tokens do Microsoft Entra. Deixe a opção Usar JWKS carregado para verificação de tokens desabilitada. A OpenAI usa os metadados do emissor e o JWKS do Microsoft Entra para verificar o token de identidade gerenciada.

  4. Adicione transformações de atributos se precisar de atributos derivados para o mapeamento. Por exemplo, insira managed_identity_client_id com a expressão assertion.appid para criar openai.managed_identity_client_id a partir da declaração de ID do aplicativo/cliente da identidade gerenciada. O painel aplica o prefixo openai. automaticamente. As declarações originais 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 único dentro desse provedor de identidade de cargas de trabalho, como vm-openai-wif. Preencha Descrição com um texto como Production VM Azure managed identity workload para explicar qual carga de trabalho pode usar o mapeamento.

  2. Exija correspondência com declarações estáveis da identidade gerenciada. Adicione uma linha com Chave e Valor para cada declaração que deve corresponder. Se o token contiver appid, defina Chave como appid e Valor como a ID do cliente da identidade gerenciada. A declaração appid identifica a ID do aplicativo/cliente da identidade gerenciada e geralmente é a declaração mais estável para vincular um mapeamento a uma identidade gerenciada específica. Se o token não contiver appid, use outra declaração estável do token decodificado, como azp, oid, sub ou xms_mirid. Para vincular o mapeamento a um locatário, defina também Chave como tid e Valor como a ID do locatário do Microsoft Entra. Decodifique um token de exemplo do IMDS e use declarações estáveis para a identidade gerenciada e o recurso nos quais você confia.

  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 Azure pode usar, como azure-managed-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 continua autorizando o acesso 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 gerenciada do Azure ao IMDS e trocá-lo por um token de acesso emitido pela OpenAI.

Defina OPENAI_WIF_AUDIENCE como o URI da ID do aplicativo do Microsoft Entra configurado como público-alvo do provedor de identidade de cargas de trabalho. O SDK solicita um token de identidade gerenciada 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 gerenciada do Azure
import OpenAI from "openai";

const imdsEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token";

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 azureManagedIdentityTokenProvider(resource) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const url = new URL(imdsEndpoint);
      url.searchParams.set("api-version", "2018-02-01");
      url.searchParams.set("resource", resource);

      const clientId = process.env.AZURE_CLIENT_ID;
      if (clientId) {
        url.searchParams.set("client_id", clientId);
      }

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

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

      const body = await response.json();
      if (!body.access_token) {
        throw new Error("Azure IMDS did not return an access token.");
      }

      return body.access_token;
    },
  };
}

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

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

console.log(response.output_text);

Práticas recomendadas para Microsoft Azure

  • Use identidades gerenciadas sempre que possível. Elas oferecem um modelo de autenticação mais simples e seguro do que a distribuição manual de credenciais.
  • Use identidades gerenciadas, aplicativos do Microsoft Entra e mapeamentos da OpenAI separados para diferentes aplicativos e ambientes. Evite compartilhar uma única identidade entre cargas de trabalho de desenvolvimento, homologação e produção.
  • Restrinja os públicos-alvo aceitos. Configure apenas os públicos-alvo necessários para a federação de identidades de cargas de trabalho da OpenAI.
  • Use aplicativos dedicados do Microsoft Entra ID para estabelecer limites de segurança. Aplicativos separados tornam mais claras a atribuição de responsabilidade, a auditoria e a gestão de acesso.
  • Prefira mapeamentos específicos para cada carga de trabalho. Use declarações específicas da carga de trabalho como critérios de correspondência, em vez de atributos amplos que se apliquem a todo o locatário.
  • Revise regularmente as configurações de credenciais federadas. Credenciais federadas obsoletas podem continuar concedendo acesso involuntariamente por muito tempo após a desativação das cargas de trabalho.
  • Separe as identidades de produção das identidades dos demais ambientes. As cargas de trabalho de produção devem se autenticar por meio de identidades federadas e contas de serviço da OpenAI distintas.