无法在PHP中生成Tumblr API请求令牌

时间:2012-01-29 20:55:02

标签: php oauth tumblr

首先,注意:我的主机没有安装PECL OAUTH或HTTP扩展。

目的:我希望创建一个界面,以便轻松跟踪和取消关注给定的Tumblr名称列表。

问题:无法通过身份验证步骤。

代码:

$request_url = 'http://www.tumblr.com/oauth/request_token';
$consumer_key = COSUMER_KEY;
$consumer_secret = CONSUMER_SECRET;
$oauth_key = urlencode_rfc3986($consumer_secret) . '&';
$time = time();
$nonce = md5(microtime() . mt_rand());
$callback_url = 'http://krisallengallery.com/easyfollowr/index.php';
$params = array('oauth_consumer_key' => $consumer_key,
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_timestamp' => $time,
                'oauth_nonce' => $nonce,
                'oauth_version' => '1.0a',
                'oauth_callback' => $callback_url);             
uksort($params, 'strcmp');

$oauth_header = 'Authorization: OAuth ';

$raw_signature = 'GET&' . urlencode_rfc3986($request_url) . '&';
$raw_suffix = array();
foreach($params as $key => $param)
{
    $raw_suffix[] = $key . '=' . $param;
}
$raw_signature .= urlencode_rfc3986(implode('&', $raw_suffix));
$oauth_signature = urlencode_rfc3986(base64_encode(hash_hmac('sha1', $raw_signature, $oauth_key, true)));

$params['oauth_signature'] = $oauth_signature;
uksort($params, 'strcmp');

$raw_head = array();
foreach($params as $key => $param)
{
    $raw_head[] = $key . '="' . $param . '"';
}
$oauth_header .= implode(',', $raw_head);

$session = curl_init($request_url);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_HEADER, true);
curl_setopt($session, CURLOPT_HTTPHEADER, array($oauth_header));
$response = curl_exec($session);
curl_close($session);
echo $response;

function urlencode_rfc3986($input)
{
    return str_replace('+', ' ', str_replace('%7E', '~', rawurlencode($input)));
}

关于我哪里出错的任何想法?

ETA:做了一些修改。它仍然无效,但我现在得到的错误是oauth_signature does not match expected value

3 个答案:

答案 0 :(得分:1)

我无法测试,所以我会给你一些尝试,看看是否有任何改进。

'$oauth_timestamp'数组中的

$params实际应为'oauth_timestamp'(无$符号)。此外,在生成查询字符串时,不应将值括在引号中。

您应该将foreach($ params)循环改为:

foreach($params as $key => $param)
{
    $raw_signature .= $key . '=' . urlencode($param) . '&';
    $oauth_header  .= $key . '=' . $param . ',';
}

$raw_signature = rtrim($raw_signature, '&');
$oauth_signature = base64_encode(hash_hmac('sha1', $raw_signature, $oauth_key));
$oauth_header .= 'oauth_signature=' . $oauth_signature;

另外,我认为您应该使用GET请求而不是POST来进行cURL。

希望有所帮助。

答案 1 :(得分:0)

我不完全确定我做错了什么,但幸运的是,我发现fangel's OAuth script on GitHub实现了生成令牌所需的一切。不过,看起来我还是在正确的轨道上。

ETA:此外,还有jacobbudin's TumblrOAuth library on GitHub,它使用fangel的脚本和一些分叉的更新代码,为您的应用程序处理用户的所有Tumblr身份验证。

当我开始尝试构建我的Followr脚本时,我确信我会回来提出更多问题。

答案 2 :(得分:0)

排除'oauth_callback'=>来自$ params数组的$ callback_url和它的一切都很好。排除后,服务器返回200代码:

HTTP/1.1 200 OK Server: nginx Date: Fri, 04 Oct 2013 19:52:51 GMT Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked Connection: close Set-Cookie: tmgioct=524f1c93c799700263374730; expires=Mon, 02-Oct-2023 19:52:51 GMT; path=/; httponly P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" oauth_token=smKHczH7Mt1MTGilqERZ28oNjJ4OP31lVtBHYTRAY8BH3f73hc&oauth_token_secret=4AxBTP8YannLZDdvR9IiTJTJIEKXocPJEHHSDd5TKQOrE6kr0N&oauth_callback_confirmed=true