> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Intercambio de tokens para autenticación social nativa

> Intercambie un token social nativo (como el de Apple o Google) por tokens de Auth0 mediante la concesión de intercambio de tokens.

export const ResponseSchema = ({statusCode, type = "{}", children}) => {
  const [open, setOpen] = useState(false);
  return <div className="border border-gray-100 dark:border-gray-800 rounded-lg mb-3 overflow-hidden">
      <div className={`flex items-center gap-2.5 px-4 py-2.5 cursor-pointer select-none ${open ? "bg-gray-50 dark:bg-gray-800" : ""}`} onClick={() => setOpen(!open)}>
        {statusCode && <span className="border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 font-mono text-xs px-1.5 py-0.5 rounded">
            {statusCode.startsWith("default") ? "default" : statusCode}
          </span>}
        <span className="text-gray-500 dark:text-gray-400 text-sm font-mono">
          {type}
        </span>
        <span className="text-gray-400 dark:text-gray-500 text-sm italic">
          application/json
        </span>
        <svg className={`ml-auto opacity-50 transition-transform duration-200 ${open ? "rotate-180" : ""}`} width="16" height="16" viewBox="0 0 16 16" fill="none">
          <path d="M4 6l4 4 4-4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
        </svg>
      </div>
      {open && <div className="px-4 pt-1 pb-3 border-t border-gray-100 dark:border-gray-800">
          {children}
        </div>}
    </div>;
};

<div id="endpoint">
  ## Endpoint
</div>

`POST /oauth/token`

<Note>
  Este flujo está pensado para usarse **solo** con interacciones sociales nativas. Se desaconseja encarecidamente usar este flujo fuera de un contexto social nativo.
</Note>

Cuando una solución no basada en navegador (como el SDK de una plataforma móvil) autentica al usuario, normalmente la autenticación da lugar a artefactos que se devuelven al código de la aplicación. En esas situaciones, este tipo de concesión permite que la plataforma Auth0 acepte artefactos de fuentes de confianza y emita tokens en respuesta. De este modo, las aplicaciones que usan mecanismos de autenticación no basados en navegador (como suele ocurrir en las aplicaciones nativas) pueden seguir obteniendo tokens de Auth0 sin requerir más interacción del usuario.

Los artefactos devueltos por este flujo (y su contenido) estarán determinados por `subject_token_type` y por la configuración del Tenant.

<div id="remarks">
  ## Observaciones
</div>

* Los alcances emitidos para la aplicación pueden diferir de los alcances solicitados. En este caso, se incluirá un parámetro `scope` en el JSON de respuesta.
* Si no solicita alcances específicos, se devolverán todos los alcances definidos para la audiencia debido a la confianza implícita otorgada a la aplicación en esta concesión. Puede personalizar los alcances devueltos en una Rule. Para obtener más información, consulte [Llamar a las API desde aplicaciones de alta confianza](https://auth0.com/docs/get-started/authentication-and-authorization-flow/resource-owner-password-flow).

<div id="learn-more">
  ## Más información
</div>

* [Agregar el inicio de sesión con Apple a aplicaciones nativas de iOS](https://auth0.com/docs/authenticate/identity-providers/social-identity-providers/apple-native)
* [iOS Swift - Quickstart de inicio de sesión con Apple](https://auth0.com/docs/quickstart/native/ios-swift)

<div id="headers">
  ## Encabezados
</div>

<ParamField header="DPoP" type="cadena">
  Una prueba DPoP para la solicitud. Es opcional y solo se requiere si su aplicación usa Demonstrating Proof-of-Possession.
</ParamField>

<div id="body-parameters">
  ## Parámetros del cuerpo
</div>

<ParamField body="auth0-forwarded-for" type="string">
  IP del usuario final como valor de cadena. Establezca este parámetro si quiere que la protección contra ataques de fuerza bruta funcione en escenarios del lado del servidor. Para obtener más información sobre cómo y cuándo usar este encabezado, consulte [Uso de Resource Owner Password desde el lado del servidor](/es/api-auth/tutorials/using-resource-owner-password-from-server-side).
</ParamField>

<ParamField body="grant_type" type="string" required>
  Indica el flujo que está usando. Para Intercambio de tokens para social nativo, use `urn:ietf:params:oauth:grant-type:token-exchange`.
</ParamField>

<ParamField body="subject_token" type="string" required>
  Artefacto de identidad emitido externamente que representa al usuario.
</ParamField>

<ParamField body="subject_token_type" type="string" required>
  Identificador que indica el tipo de `subject_token`.
</ParamField>

<ParamField body="client_id" type="string" required>
  El ID de cliente de su aplicación.
</ParamField>

<ParamField body="audience" type="string">
  El identificador único de la API de destino a la que desea acceder.
</ParamField>

<ParamField body="resource" type="string">
  El identificador de la API de destino (servidor de recursos) a la que desea acceder. Debe coincidir con un identificador de API registrado en su Tenant de Auth0. Se usa como alternativa a `audience` cuando el [perfil de compatibilidad del parámetro Resource](https://auth0.com/docs/get-started/tenant-settings#settings-advanced) del Tenant está configurado como `compatibility`.
</ParamField>

<ParamField body="scope" type="string">
  Valor de cadena de los distintos alcances que solicita la aplicación. Los alcances múltiples se separan con espacios en blanco.
</ParamField>

<ParamField body="user_profile" type="object">
  Elemento opcional que se usa para interacciones nativas de iOS en las que pueden producirse actualizaciones del perfil. El valor esperado del parámetro será JSON con la forma: `{ name: { firstName: 'John', lastName: 'Smith' }}`.

  <Expandable title="propiedades">
    <ParamField body="name" type="object" />
  </Expandable>
</ParamField>

<div id="response-schema">
  ## Esquema de respuesta
</div>

<ResponseSchema statusCode="200">
  <ResponseField name="access_token" type="string">
    El token de acceso emitido.
  </ResponseField>

  <ResponseField name="id_token" type="string">
    El token de ID emitido.
  </ResponseField>

  <ResponseField name="refresh_token" type="string">
    El Token de actualización emitido.
  </ResponseField>

  <ResponseField name="token_type" type="string">
    El tipo de token emitido.
  </ResponseField>

  <ResponseField name="expires_in" type="integer">
    La duración del token de acceso en segundos.
  </ResponseField>
</ResponseSchema>

<ResponseSchema statusCode="default error">
  <ResponseField name="error" type="string">
    Código de error.
  </ResponseField>

  <ResponseField name="error_description" type="string">
    Descripción del error.
  </ResponseField>
</ResponseSchema>

<div id="response-messages">
  ## Mensajes de respuesta
</div>

| Estado  | Descripción       |
| ------- | ----------------- |
| 200     | Respuesta exitosa |
| default | Error inesperado  |
