Por que não posso autenticar com o OAuth?

Eu escrevi um aplicativo muito simples para atualizar meu status do twitter em uma determinada condição. Eu usei a documentação do Twitter para entender os requisitos da criação da assinatura OAuth e também como estruturar o cabeçalho Authorization. Eu então envio o pedido com cURL em PHP.

Usando as ferramentas OAuth no site do twitter dev, comparei a string base e o cabeçalho de autorização da minha assinatura e ambos são exatamente os mesmos:

Cadeia Base de Assinatura

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.

Cabeçalho de autorização

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 eu substituí alguns personagens comx para esconder meus dados, mas comparar os dois caracteres para caractere produz exatamente o mesmo resultado. Para referência, codifico o timestamp e o nonce que a Ferramenta OAuth gera para que meus valores possam ser os mesmos para a verificação. Meu nível de acesso está definido como Read and write. Na mesma página, há um exemplo final - o comando para executar com cURL na linha de comando. Quando executo este comando, ele funciona perfeitamente e publica no meu feed do Twitter sem problemas.

Com isso em mente, acredito que tudo o que criei até agora é bom, e não pense que há muito o que fazer para postar o código que gera os detalhes mencionados anteriormente. No entanto, o código que eu uso para fazer a chamada, usando cURL, eu acho que é o culpado, mas não posso dizer o porquê:

<?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);

Observe que$baseUrl, $header e$status são as mesmas variáveis ​​usadas na geração da string de base da assinatura e do cabeçalho de autorização, que correspondem muito bem.

A saída da página quando executada é:

object(stdClass)#1 (2) { ["error"]=> string(34) "Could not authenticate with OAuth." ["request"]=> string(23) "/1/statuses/update.json" }

Espero que haja detalhes suficientes aqui para alguém me apontar na direção certa!

questionAnswers(2)

yourAnswerToTheQuestion