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 carga de trabajo para Microsoft Azure

Usa Microsoft Azure como proveedor de identidades de carga de trabajo en cualquiera de estos escenarios:

  • Identidad administrada de Azure: intercambia un token de acceso de Microsoft Entra ID emitido para una identidad administrada por un token de acceso de OpenAI de corta duración.
  • AKS: intercambia un token proyectado de una cuenta de servicio de Azure Kubernetes Service (AKS) por un token de acceso de OpenAI de corta duración.

Identidad administrada de Azure

Las identidades administradas de Azure permiten que las cargas de trabajo alojadas en Azure soliciten tokens de Microsoft Entra sin almacenar secretos de larga duración. En la federación de identidades de carga de trabajo de OpenAI, el token de la identidad administrada es el token de sujeto que OpenAI valida antes de emitir un token de acceso de OpenAI.

Configurar una identidad administrada de Azure

Crea o usa un registro de aplicación de Microsoft Entra que represente la audiencia del token en la que OpenAI debe confiar. Configura el URI de ID de aplicación. Tu carga de trabajo usa este URI como valor de resource al solicitar un token al servicio de metadatos de instancia de Azure (IMDS). El URI aparece en la notificación aud del token emitido. Para ver los pasos de configuración, consulta la guía de Microsoft Entra para crear una nueva aplicación de Entra ID y una entidad de servicio.

El URI de ID de aplicación configurado en Microsoft Entra ID, el parámetro resource de IMDS, la notificación aud del token resultante y la audiencia del proveedor de identidades de carga de trabajo de OpenAI deben coincidir.

Crea una identidad administrada y luego asígnala al recurso de Azure que ejecuta tu aplicación, como una máquina virtual. El recurso debe poder llamar a IMDS durante la ejecución. Para obtener más detalles sobre la configuración de Azure, consulta la introducción a las identidades administradas de Microsoft y la documentación del recurso de Azure correspondiente para asignar la identidad.

Obtener un token de identidad administrada de Azure

Desde el recurso de Azure al que asignaste la identidad administrada, solicita un token a IMDS con el URI de ID de aplicación como valor del parámetro resource. Este es el token de sujeto que OpenAI intercambia por un token de acceso emitido por 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

Si el recurso tiene varias identidades administradas asignadas por el usuario, agrega el parámetro de consulta client_id, object_id o msi_res_id correspondiente a la identidad administrada que quieras usar. Microsoft documenta los parámetros de la solicitud de tokens a IMDS en Usar identidades administradas en una máquina virtual para obtener un token de acceso.

Verificar el token

Antes de configurar la federación de identidades de carga de trabajo, exporta el token de Microsoft Entra como TOKEN y ejecuta este script de forma local para inspeccionar sus notificaciones:

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 la carga útil 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.

Al decodificar un token de identidad administrada de Microsoft Entra ID, verás un resultado similar a este:

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

Verifica las notificaciones que vas a configurar en OpenAI:

  • iss: usa el valor exacto del emisor que aparece en el token. El emisor podría ser https://login.microsoftonline.com/<tenant-id>/v2.0, pero no des por hecho que lleva ese sufijo.
  • aud: debe coincidir con el URI de ID de aplicación, el parámetro resource de IMDS y la audiencia del proveedor de identidades de carga de trabajo de OpenAI.
  • tid: el ID del inquilino de Microsoft Entra.
  • appid: el ID de aplicación o de cliente de la identidad administrada, si está presente.
  • iat y exp: comprueba la vigencia total del token, exp - iat, en segundos.

Para Codex, establece max_assertion_lifetime_seconds del proveedor en un límite aprobado que cubra el intervalo de vigencias previsto para los tokens del emisor. No uses el tiempo de vigencia restante del token ni des por hecho que todos los tokens de Entra duran una hora. Microsoft documenta la vigencia variable de los tokens de acceso y no permite configurar la vigencia de los tokens de identidad administrada.

Los tokens de identidad administrada también pueden contener notificaciones como azp, oid, sub o xms_mirid. Toma el token decodificado como referencia y elige notificaciones que identifiquen con precisión la identidad administrada y el ámbito de recursos en los que confías.

Usa la carga útil decodificada para comparar el 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 al revisar las notificaciones iss, aud y tid, junto con las de la identidad administrada.

Configurar la federación de identidades de carga de trabajo

Crea en OpenAI un proveedor de identidades de carga de trabajo para el emisor de Microsoft Entra ID y luego agrega una asignación de cuenta de servicio que coincida con notificaciones estables del token de identidad administrada.

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

Configurar el proveedor de identidades de carga de trabajo

  1. Crea el proveedor de identidades de carga de trabajo. En Nombre, ingresa un valor único, como azure-managed-identity-prod. En Descripción, ingresa un texto como Production Azure managed identity workloads para que los administradores puedan identificar el proveedor.

  2. Configura el emisor y la audiencia. En URL del emisor OIDC, ingresa el valor exacto de la notificación iss del token. Primero, obtén un token de identidad administrada de muestra e inspecciona sus notificaciones. Por ejemplo, el emisor podría ser https://login.microsoftonline.com/<tenant-id>/v2.0. En Audiencia, ingresa el URI de ID de aplicación que configuraste en Microsoft Entra, como api://<application-client-id>. Este valor debe coincidir con la notificación aud del token.

  3. Usa la verificación de tokens de Microsoft Entra. Deja desactivada la opción Usar el JWKS cargado para verificar el token. OpenAI usa los metadatos y el JWKS del emisor de Microsoft Entra para verificar el token de identidad administrada.

  4. Agrega transformaciones de atributos si necesitas atributos derivados para la asignación. Por ejemplo, ingresa managed_identity_client_id con la expresión assertion.appid para crear openai.managed_identity_client_id a partir de la notificación del ID de aplicación o de cliente de la identidad administrada. El panel aplica el prefijo openai. automáticamente. Si una notificación del token ya empieza con openai., su valor original se ignora en las claves de asignación con el prefijo openai., a menos que se configure una transformación correspondiente.

Configurar la asignación de cuenta de servicio

  1. Crea una asignación de cuenta de servicio. En Nombre, ingresa un valor único dentro de ese proveedor de identidades de carga de trabajo, como vm-openai-wif. En Descripción, ingresa un texto como Production VM Azure managed identity workload para indicar qué carga de trabajo puede usar la asignación.

  2. Exige que coincidan las notificaciones estables de la identidad administrada. Agrega una fila con su Clave y su Valor por cada notificación que deba coincidir. Si el token contiene appid, ingresa en Clave el valor appid y en Valor el ID de cliente de la identidad administrada. La notificación appid contiene el ID de aplicación o de cliente de la identidad administrada y suele ser la más estable para vincular una asignación a una identidad administrada específica. Si tu token no contiene appid, usa otra notificación estable del token decodificado, como azp, oid, sub o xms_mirid. Para vincular la asignación a un solo inquilino, agrega también una fila con Clave igual a tid y Valor igual al ID del inquilino de Microsoft Entra. Decodifica un token de muestra de IMDS y usa notificaciones que sean estables para la identidad administrada y el recurso en los que confías.

  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 Azure, como azure-managed-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 restringir aún más el acceso que otorgan los tokens emitidos a partir de esta asignación. Deja los permisos en blanco si quieres evitar una restricción de alcance específica de la federación de identidades de carga de trabajo (WIF). El token seguirá autorizando el acceso con los permisos de la cuenta de servicio asignada.

Usar el token en el código

Configura el cliente del SDK de OpenAI para que solicite a IMDS un token de identidad administrada de Azure y lo intercambie por un token de acceso emitido por OpenAI.

Establece OPENAI_WIF_AUDIENCE en el URI de ID de aplicación de Microsoft Entra configurado como audiencia del proveedor de identidades de carga de trabajo. El SDK solicita un token de identidad administrada 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.

Autenticarse con un token de identidad administrada de 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ácticas recomendadas para Microsoft Azure

  • Usa identidades administradas siempre que sea posible. Ofrecen un modelo de autenticación más sencillo y seguro que la distribución manual de credenciales.
  • Usa identidades administradas, aplicaciones de Microsoft Entra y asignaciones de OpenAI distintas para cada aplicación y entorno. Evita compartir una identidad entre cargas de trabajo de desarrollo, preproducción y producción.
  • Restringe las audiencias aceptadas. Configura solo las audiencias necesarias para la federación de identidades de carga de trabajo de OpenAI.
  • Usa aplicaciones de Microsoft Entra ID dedicadas a cada ámbito de seguridad. Separar las aplicaciones facilita la identificación de los responsables, las auditorías y la administración del acceso.
  • Da preferencia a las asignaciones específicas de cada carga de trabajo. Usa como criterios de coincidencia las notificaciones propias de la carga de trabajo en lugar de atributos generales de todo el inquilino.
  • Revisa periódicamente la configuración de las credenciales federadas. Si quedan credenciales federadas obsoletas, podrían seguir otorgando acceso de forma involuntaria mucho después de que se retiren las cargas de trabajo.
  • Separa las identidades de producción de las de otros entornos. Las cargas de trabajo de producción deben autenticarse con identidades federadas y cuentas de servicio de OpenAI distintas de las que se usan en otros entornos.