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;
}
コードを投稿してください。 – hakre
*明らかに、私は最初からそれをやり遂げるのに狂った唯一の人です* ...何か特別な理由は? –
@cillosis私は、私たちがそこで見つけた図書館、フレームワーク、およびSDKのワーパを超えて、物事がどのように機能するかを知りたい。 – Pankas