Saltar al contenido principal

Creación de una firma

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. La solicitud utilizada para demostrar el proceso de firma es un POST a 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 HTTPPOST
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.

Recopilación de parámetros

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:
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.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 cada clave y valor que se vaya a firmar.
  2. Ordena la lista de parámetros alfabéticamente [1] por clave codificada [2].
  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:
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.0

Creación de la cadena base de firma

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

Obtención de una clave de firma

Los últimos datos que debes recopilar son secretos que identifican la X app 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 al ver la página de detalles de la app. Este será el mismo para cada solicitud que envíe tu X app.
Consumer secretkAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw
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.
OAuth token secretLswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
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: Ten en cuenta que existen algunos flujos, como al obtener un request token, 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 seguido de un carácter ampersand ‘&’.
Signing keykAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE

Cálculo de la firma

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 signatureLs93hJiZbQ3akF3HF3x1Bz8/zU4=