2012-04-17 14 views
2

Twitter APIからリクエストトークンを取得しようとしていて、Twitterアカウントでユーザーにログインすると、「oauth署名とトークンの検証に失敗しました」という401の応答が得られます。私はPHPでこれをやっています。私は同様の質問を探しましたが、明らかに私はライブラリなしでそれを最初からやり遂げるのに狂った唯一の人です。Twitter OAUThとPHP

APIドキュメントでは、権限ヘッダーで送信された値を "パーセントエンコード"しています。正しいかどうかわからないurlencode()関数を使用しています。

署名を計算するには、hash_hmac( 'SHA1'、$ signParameters、$ hashKey)を使用します。使用する権利が正しいかどうかはわかりません。

この

カールを通じて、生成されます要求です:私は本当にあなたが与えることができる任意のヘルプをお願い申し上げます

POST /oauth/request_token HTTP/1.1 
Host: api.twitter.com 
Accept: */* 
Authorization: OAuth oauth_callback="http%3A%2F%2Fwww.soytumascota.com%2Ftwitter%2Fuser.php", oauth_consumer_key="MY_APP_KEY", oauth_nonce="0dde25902bde5f3b280f58ea642047cf", oauth_signature_method="HMAC_SHA1", oauth_timestamp="1334697987", oauth_version="1.0", oauth_signature="8313277875f20cd8a8631966a2ba273a5d13aeda" 
Content-Length: 0 
Content-Type: application/x-www-form-urlencoded 
Expect: 100-continue 

、ありがとうございました。

編集:これまでに書いたコードは次のとおりです。

<?php 
DEFINE('CONSUMER_KEY', 'MY_APP_KEY'); 
DEFINE('CONSUMER_SECRET', 'MY_APP_SECRET'); 

$url = 'https://api.twitter.com/oauth/request_token'; 

//setting OAuth parameters 
$Oauth = Array(); 
$Oauth['oauth_callback'] = 'http://www.soytumascota.com/twitter/user.php'; 
$Oauth['oauth_consumer_key'] = CONSUMER_KEY; 
$Oauth['oauth_nonce'] = md5($Oauth['oauth_callback'] . CONSUMER_KEY . time()); 
$Oauth['oauth_signature_method'] = 'HMAC_SHA1'; 
$Oauth['oauth_timestamp'] = (string) time(); 
$Oauth['oauth_version'] = '1.0'; 

//signature and authorization header are calculated inside functions 
$Oauth['oauth_signature'] = calculateSignature('POST', $url, $Oauth); 
$authorization = getAuthorizationHeader($Oauth); 
ksort($Oauth); 

//setting and sending request using cURL 
$curl_session = curl_init($url); 
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl_session, CURLOPT_POST, true); 
curl_setopt($curl_session, CURLINFO_HEADER_OUT, true); 
curl_setopt($curl_session, CURLOPT_HTTPHEADER, Array('Authorization: ' . $authorization)); 

$result = curl_exec($curl_session); 


function getAuthorizationHeader($parameters) 
{ 
    $authorization = 'OAuth '; 
    $j = count($parameters); 
    foreach($parameters as $key => $val) 
    { 
     $authorization .= $key . '="' . urlencode($val) . '"'; 

     if($j-- > 1) 
     { 
      $authorization .= ', '; 
     } 
    } 

    return $authorization; 
} 

function calculateSignature($method, $url, $parameters, $accessToken = '') 
{ 
    foreach($parameters as $key => $val) 
    { 
     $foo = urlencode($key); 
     unset($parameters[$key]); 

     $parameters[$foo] = urlencode($val);  
    } 

    ksort($parameters); 

    $signBase = ''; 
    $j = count($parameters); 
    foreach($parameters as $key => $val) 
    { 
     $signBase .= "{$key}={$val}"; 

     if($j-- > 1) 
     { 
      $signBase .= '&'; 
     } 
    } 

    $signBase = strtoupper($method) . '&' . urlencode($url) . '&' . urlencode($signBase); 

    $signKey = urlencode(CONSUMER_SECRET) . '&' . urlencode($accessToken); 

    $signature = hash_hmac('SHA1', $signParameters, $hashKey); 

    return $signature; 
} 
+0

コードを投稿してください。 – hakre

+0

*明らかに、私は最初からそれをやり遂げるのに狂った唯一の人です* ...何か特別な理由は? –

+0

@cillosis私は、私たちがそこで見つけた図書館、フレームワーク、およびSDKのワーパを超えて、物事がどのように機能するかを知りたい。 – Pankas

答えて

3

まず、 'oauth_signature_method' 'はHMAC-SHA1' でなければなりません(または何も動作しません)。

「パーセントエンコード」については、APIドキュメントhttps://dev.twitter.com/docs/auth/percent-encoding-parametersでは、RFC3986に従って文字列をエンコードする必要があるため、urlencodeの代わりにrawurlencodeを使用する必要があります。

$signature = base64_encode(hash_hmac('SHA1', $signBase, $signKey, true)); 

そして最後に、あなたが

を追加する必要があります:あなたはHMAC-SHA1ハッシュアルゴリズムを使用して、BASE64に生の出力を変換する、のようなものする必要があり、彼らは https://dev.twitter.com/docs/auth/creating-signatureここで言う署名を計算するのに

//no content 
curl_setopt($curl_session, CURLOPT_POSTFIELDS, ''); 
//no verify certs 
curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, FALSE); 

curlオプションを使用すると、要求が機能します。

+0

私はこの答えを見直さず、これについて完全に忘れてしまった。私はこの新しい情報でもう一度試してみましょう、ありがとうございます。 – Pankas