He escrito una aplicación muy simple para actualizar mi estado de Twitter en una condición dada. He utilizado la documentación de Twitter para comprender los requisitos para crear la firma OAuth y también cómo estructurar el encabezado Authorization. Luego envío la solicitud con cURL en PHP.¿Por qué no puedo autenticarme con OAuth?
Uso de las herramientas de OAuth en el sitio Twitter dev, que en comparación tanto mi cadena de base de la firma y autorización de cabecera, y ambos son exactamente los mismos:
Base Firma cadena
POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&oauth_consumer_key%3DYNxxxxxxxxxxxWnfI6HA%26oauth_nonce%3D31077a3c7b7bee4e4c7e2b5185041c12%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340729904%26oauth_token%3D2991771-4csoiO2fxmWgSxxxxxxxxxxDjWj2AbyxATtiuadNE%26oauth_version%3D1.0%26status%3Dblah%2520test%2520blah.
Autorización encabezado
Authorization: OAuth oauth_consumer_key="YN4FLBxxxxxxxxxxI6HA", oauth_nonce="31077a3c7b7bee4e4c7e2b5185041c12", oauth_signature="M2cXepcxxxxxxxxxxAImeAjE%2FHc%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1340729904", oauth_token="2991771-4cxxxxxxxxxxSmRvjzMoooMDjWj2AbyxATtiuadNE", oauth_version="1.0"
Obviamente he reemplazado s Algunos caracteres con x
para ocultar mis datos, pero al comparar los dos caracteres para el carácter se obtiene exactamente el mismo resultado. Como referencia, codifico la marca de tiempo y la fecha de nacimiento que genera la herramienta OAuth para que mis valores puedan ser los mismos para la verificación. Mi nivel de acceso está configurado para Leer y escribir. En esa misma página hay un último ejemplo: el comando para ejecutar con cURL en la línea de comando. Cuando ejecuto este comando, funciona perfectamente y se publica en mi feed de Twitter sin problemas.
Teniendo esto en cuenta, creo que todo lo que he creado hasta ahora está bien, y no creo que haya mucho más que publique el código que genera los detalles mencionados anteriormente. Sin embargo, el código que utilizo para hacer la llamada, usando cURL, creo que es el culpable, pero no puede decir por qué:
<?php
// ...
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $baseUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: $header"));
curl_setopt($curl, CURLOPT_POSTFIELDS, array('status' => $status));
$result = json_decode(curl_exec($curl));
curl_close($curl);
var_dump($result);
Tenga en cuenta que $baseUrl
, $header
y $status
son las mismas variables utilizadas en la generación de la firma cadena de base y encabezado de autorización, que coinciden muy bien.
La salida de la página cuando el funcionamiento es:
object(stdClass)#1 (2) { ["error"]=> string(34) "Could not authenticate with OAuth." ["request"]=> string(23) "/1/statuses/update.json" }
espero que haya suficientes detalles aquí para que alguien me punto en la dirección correcta!
¿Ha consultado https://dev.twitter.com/discussions/305 (por ejemplo, consulte la URL) y https://dev.twitter.com/discussions/308 (por ejemplo, verifique las opciones de HTTPS)? – Will
Lamentablemente, sí. Como dije, la cadena base de la firma y el encabezado de autorización son exactamente iguales, y como la curva de línea de comando funciona perfectamente, no puede ser ninguna de estas. – LeonardChallis
Tenía exactamente el mismo problema. ¡Gracias! – bozdoz