> ## 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.

# Obtener un token

> Intercambie un código de autorización por un token en el paso final del Flujo de código de autorización con PKCE.

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`

Este es el flujo que usan las aplicaciones móviles para acceder a una API. Use este endpoint para intercambiar un código de autorización por un token.

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

* Para mejorar la compatibilidad de las aplicaciones, Auth0 ahora devolverá la información del perfil en un formato estructurado de claims, tal como lo define la especificación OIDC. Esto significa que, para agregar claims personalizados a los ID tokens o tokens de acceso, deben ajustarse a un formato con espacio de nombres para evitar posibles colisiones con claims estándar de OIDC.
* Incluye `offline_access` en el parámetro de solicitud `scope` para obtener un token de actualización desde POST /oauth/token. Asegúrate de que el campo Allow Offline Access esté habilitado en la configuración de la API.
* El valor de `redirect_uri` debe especificarse como una URL de callback válida en la configuración de tu aplicación.
* La autenticación silenciosa te permite realizar un flujo de autenticación en el que Auth0 solo responderá con redirecciones y nunca con una página de inicio de sesión. Cuando un token de acceso haya expirado, la autenticación silenciosa puede usarse para obtener uno nuevo sin interacción del usuario, siempre que la sesión de SSO del usuario no haya expirado.

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

* [Flujo de código de autorización con PKCE](https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce)
* [Llamar a una API mediante el Flujo de código de autorización con PKCE](https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/call-your-api-using-the-authorization-code-flow-with-pkce)
* [Autenticación silenciosa](https://auth0.com/docs/authenticate/login/configure-silent-authentication)

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

<ParamField header="DPoP" type="string">
  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="grant_type" type="string" required>
  Indica el flujo que está usando. Para Código de autorización (PKCE), use `authorization_code`.

  Valores permitidos: `authorization_code`
</ParamField>

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

<ParamField body="code" type="string" required>
  El código de autorización recibido en la llamada inicial a `/authorize`.
</ParamField>

<ParamField body="code_verifier" type="string" required>
  Clave aleatoria criptográficamente segura utilizada para generar el `code_challenge` enviado a `/authorize`.
</ParamField>

<ParamField body="redirect_uri" type="string">
  Solo es obligatorio si se estableció en el endpoint `GET` `/authorize`.
</ParamField>

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

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

  <ResponseField name="refresh_token" type="string">
    El token de actualización que se usa para obtener nuevos tokens de acceso.
  </ResponseField>

  <ResponseField name="id_token" type="string">
    El ID Token.
  </ResponseField>

  <ResponseField name="token_type" type="string">
    El tipo de token. Por lo general, `Bearer`.
  </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     | Intercambio del token realizado correctamente. |
| default | Error inesperado                               |
