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

# Creación de una firma

export const Button = ({href, children}) => {
  return <div className="not-prose group">
    <a href={href}>
      <button className="flex items-center space-x-2.5 py-1 px-4 bg-primary-dark dark:bg-white text-white dark:text-gray-950 rounded-full group-hover:opacity-[0.9] font-medium">
        <span>
          {children}
        </span>
        <svg width="3" height="24" viewBox="0 -9 3 24" class="h-6 rotate-0 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>
      </button>
    </a>
  </div>;
};

<div id="creating-a-signature">
  ### Creación de una firma
</div>

Esta página explica cómo generar una firma OAuth 1.0a HMAC-SHA1 para una solicitud HTTP. Esta firma es apta para enviarla a la X API como parte de una solicitud autorizada, como se describe en [cómo autorizar una solicitud.](/es/resources/fundamentals/authentication/oauth-1-0a/authorizing-a-request)

La solicitud utilizada para demostrar el proceso de firma es un POST a [https://api.x.com/1.1/statuses/update.json](https://api.x.com/1.1/statuses/update.json). La solicitud en bruto se ve así:

```
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
```

**Recopilar el método de solicitud y la URL**

Para generar una firma, comienza determinando el método HTTP y la URL de la solicitud. Estos dos datos ya se conocen cuando creas la solicitud, por lo que son fáciles de obtener.

El método de la solicitud casi siempre será GET o POST para solicitudes a X API.

|             |      |
| :---------- | :--- |
| Método HTTP | POST |

La URL base es la URL a la que se dirige la solicitud, sin incluir ningún parámetro de cadena de consulta (`query string`) ni de fragmento (hash). Es importante usar el protocolo correcto aquí, así que asegúrate de que la parte “https\://” de la URL coincida con la solicitud real enviada a la API.

|          |                                                                                          |
| :------- | :--------------------------------------------------------------------------------------- |
| URL base | [https://api.x.com/1.1/statuses/update.json](https://api.x.com/1.1/statuses/update.json) |

<div id="collecting-parameters">
  #### Recopilación de parámetros
</div>

A continuación, recopila todos los parámetros incluidos en la solicitud. Hay dos ubicaciones posibles para estos parámetros adicionales: la URL (como parte de la cadena de consulta) y el cuerpo de la solicitud. La solicitud de ejemplo incluye un solo parámetro en ambas ubicaciones:

```
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
```

Una solicitud HTTP tiene parámetros que están codificados en la URL, pero debes recopilar los valores sin procesar. Además de los parámetros de la solicitud, cada parámetro oauth\_\* debe incluirse en la firma, así que recógelos también. Estos son los parámetros de [autorizar una solicitud](/es/resources/fundamentals/authentication/oauth-1-0a/authorizing-a-request):

|                          |                                                    |
| :----------------------- | :------------------------------------------------- |
| status                   | Hello Ladies + Gentlemen, a signed OAuth request!  |
| include\_entities        | true                                               |
| oauth\_consumer\_key     | xvz1evFS4wEEPTGEFPHBog                             |
| oauth\_nonce             | kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg         |
| oauth\_signature\_method | HMAC-SHA1                                          |
| oauth\_timestamp         | 1318622958                                         |
| oauth\_token             | 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb |
| oauth\_version           | 1.0                                                |

Estos valores deben codificarse en una sola cadena, que se utilizará más adelante. El proceso para construir la cadena es muy específico:

1. [Codifica mediante percent-encoding](/es/resources/fundamentals/authentication/oauth-1-0a/percent-encoding-parameters) cada clave y valor que se vaya a firmar.
2. Ordena la lista de parámetros alfabéticamente [\[1\]](/es/resources/fundamentals/authentication/oauth-1-0a/creating-a-signature) por clave codificada [\[2\]](/es/resources/fundamentals/authentication/oauth-1-0a/creating-a-signature).
3. Para cada par clave/valor:
4. Añade la clave codificada a la cadena de salida.
5. Añade el carácter ‘=’ a la cadena de salida.
6. Añade el valor codificado a la cadena de salida.
7. Si quedan más pares clave/valor, añade un carácter ‘&’ a la cadena de salida.
    

\[1] La especificación de OAuth indica ordenar lexicográficamente, que es el orden alfabético predeterminado para muchas bibliotecas.

\[2] En el caso de dos parámetros con la misma clave codificada, la especificación de OAuth indica seguir ordenando según el valor. Sin embargo, X no acepta claves duplicadas en las solicitudes de API
 

**Cadena de parámetros**

La siguiente *cadena de parámetros* se generará repitiendo estos pasos con los parámetros recopilados anteriormente:

| status                   | Hello Ladies + Gentlemen, a signed OAuth request!  |
| :----------------------- | :------------------------------------------------- |
| `include_entities`       | true                                               |
| `oauth_consumer_key`     | xvz1evFS4wEEPTGEFPHBog                             |
| `oauth_nonce`            | kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg         |
| `oauth_signature_method` | HMAC-SHA1                                          |
| `oauth_timestamp`        | 1318622958                                         |
| `oauth_token`            | 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb |
| `oauth_version`          | 1.0                                                |

<div id="creating-the-signature-base-string">
  #### Creación de la cadena base de firma
</div>

Los tres valores recopilados hasta ahora deben unirse para formar una única cadena, a partir de la cual se generará la firma. Esto se denomina **cadena base de firma** según la especificación OAuth.

Para codificar el método HTTP, la URL base y la cadena de parámetros en una sola cadena:

1. Convierte el método HTTP a mayúsculas y establece la cadena de salida igual a este valor.
2. Añade el carácter ‘&’ a la cadena de salida.
3. [Codifica con percent-encoding](/es/resources/fundamentals/authentication/oauth-1-0a/percent-encoding-parameters) la URL y añádela a la cadena de salida.
4. Añade el carácter ‘&’ a la cadena de salida.
5. [Codifica con percent-encoding](/es/resources/fundamentals/authentication/oauth-1-0a/percent-encoding-parameters) la cadena de parámetros y añádela a la cadena de salida.
    

Esto producirá la siguiente *cadena base de firma*:

```
POST&https%3A%2F%2Fapi.x.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521
```

Asegúrate de aplicar percent-encoding a la cadena de parámetros. La cadena base de la firma debe contener exactamente 2 caracteres de ampersand ‘&’. Los caracteres de porcentaje ‘%’ en la cadena de parámetros deben codificarse como %25 en la cadena base de la firma.

<div id="getting-a-signing-key">
  #### Obtención de una clave de firma
</div>

Los últimos datos que debes recopilar son secretos que identifican la [X app](/es/resources/fundamentals/developer-apps) que realiza la solicitud y al usuario en cuyo nombre se hace la solicitud. Es muy importante tener en cuenta que estos valores son extremadamente sensibles y nunca deben compartirse con nadie.

El valor que identifica tu app ante X se llama **consumer secret** y se puede encontrar en la [Consola de desarrollador](/es/resources/fundamentals/developer-portal) al ver la [página de detalles de la app](/es/resources/fundamentals/developer-apps). Este será el mismo para cada solicitud que envíe tu X app.

|                 |                                             |
| :-------------- | :------------------------------------------ |
| Consumer secret | kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw |

El valor que identifica la cuenta en cuyo nombre actúa tu aplicación se llama **OAuth token secret**. Este valor se puede obtener de varias maneras, todas las cuales se describen en [obtención de tokens de acceso](/es/resources/fundamentals/authentication/oauth-1-0a/obtaining-user-access-tokens).

|                    |                                           |
| :----------------- | :---------------------------------------- |
| OAuth token secret | LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE |

Una vez más, es muy importante mantener estos valores privados dentro de tu aplicación. Si consideras que tus valores se han visto comprometidos, regenera tus tokens (los tokens de esta página se han marcado como inválidos para solicitudes reales).

Ambos valores deben combinarse para formar una **clave de firma** que se usará para generar la firma. La clave de firma es simplemente el token secret [codificado en porcentaje](/es/resources/fundamentals/authentication/oauth-1-0a/percent-encoding-parameters):

Ten en cuenta que existen algunos flujos, como al obtener un [request token](/es/resources/fundamentals/authentication/oauth-1-0a/obtaining-user-access-tokens), en los que el token secret aún no se conoce. En este caso, la clave de firma debe consistir en el **consumer secret** [codificado en porcentaje](/es/resources/fundamentals/authentication/oauth-1-0a/percent-encoding-parameters) seguido de un carácter ampersand ‘&’.

|             |                                                                                        |
| :---------- | :------------------------------------------------------------------------------------- |
| Signing key | kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw\&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE |

<div id="calculating-the-signature">
  #### Cálculo de la firma
</div>

Finalmente, la firma se calcula pasando la cadena base de la firma y la clave de firmado al algoritmo de hash HMAC-SHA1. Los detalles del algoritmo se explican en la función hash\_hmac.

La salida de la función de firmado HMAC es una cadena binaria. Esta debe codificarse en base64 para producir la cadena de firma. Por ejemplo, el resultado usando la cadena base y la clave de firmado proporcionadas en esta página es 2E CF 77 84 98 99 6D 0D DA 90 5D C7 17 7C 75 07 3F 3F CD 4E. Ese valor, cuando se convierte a base64, es la firma OAuth para esta solicitud:

|                 |                              |
| :-------------- | :--------------------------- |
| OAuth signature | Ls93hJiZbQ3akF3HF3x1Bz8/zU4= |
