我按照this stackoverflow question中发布的说明操作,但我被卡住了。
我正在使用来自Github的tumblr / tumblr.php(官方的“tumblr API的PHP客户端”)。
我也遵循指示here(实际上是推特),但这些指示并非适合我正在使用的git库。
我有一个有效的消费者密钥和秘密。
从那些我发出请求并获得oauth_token和oauth_token_secret之类的话:
$client = new Tumblr\API\Client($consumerKey,$consumerSecret);
$client->getRequestHandler()->setBaseUrl('https://www.tumblr.com/');
$req = $client->getRequestHandler()->request('POST', 'oauth/request_token', [
'oauth_callback' => '...',
]);
// Get the result
$result = $req->body->__toString();
print_r( $result );
这给了我:
oauth_token=2C6f...MqSF&oauth_token_secret=HaGh...IJLi&oauth_callback_confirmed=true
然后我将用户发送到http://www.tumblr.com/oauth/authorize?oauth_token=2C6f...MqSF,以便他们可以访问该应用。重定向到:...?oauth_token=2C6f...MqSF&oauth_verifier=nvjl...GtEa#_=_
现在在最后一步,我相信我应该将我的请求令牌转换为访问令牌。是对的吗?我做错了什么:
$client = new Tumblr\API\Client($consumerKey,$consumerSecret);
$client->getRequestHandler()->setBaseUrl('https://www.tumblr.com/');
$req = $client->getRequestHandler()->request('POST', 'oauth/access_token', [
'oauth_token' => '2C6f...MqSF',
'oauth_verifier' => 'nvjl...GtEa'
]);
// Get the result
$result = $req->body->__toString();
print_r( $result );
因为我收到了这样的回复:
oauth_signature [AqbbYs0XSZ7plqB0V3UQ6O6SCVI=] does not match expected value [0XwhYMWswlRWgcr6WeA7/RrwrhA=]
我的最后一步出了什么问题?
我不确定是否应该发送oauth_verifier
请求。 #_=_
应该属于oauth_verifier
吗?我不这么认为。对于我尝试的所有变体,我都会收到签名错误。
如果没有令牌和tokenSecret,我无法对API进行某些调用。我收到未经授权的403回复。当我从第二步使用token和token_secret时也一样。我很确定我需要一个新的令牌/秘密对。
答案 0 :(得分:7)
你非常接近,你只是在最后一步中错误地传递oauth_token,并跳过oauth_token_secret altogeter。
我已经编译了这个工作代码(您现在也可以在https://github.com/tumblr/tumblr.php/wiki/Authentication上找到发布在Wiki上的代码):
<?php
require_once('vendor/autoload.php');
// some variables that will be pretttty useful
$consumerKey = '<your consumer key>';
$consumerSecret = 'your consumer secret>';
$client = new Tumblr\API\Client($consumerKey, $consumerSecret);
$requestHandler = $client->getRequestHandler();
$requestHandler->setBaseUrl('https://www.tumblr.com/');
// start the old gal up
$resp = $requestHandler->request('POST', 'oauth/request_token', array());
// get the oauth_token
$out = $result = $resp->body;
$data = array();
parse_str($out, $data);
// tell the user where to go
echo 'https://www.tumblr.com/oauth/authorize?oauth_token=' . $data['oauth_token'];
$client->setToken($data['oauth_token'], $data['oauth_token_secret']);
// get the verifier
echo "\noauth_verifier: ";
$handle = fopen('php://stdin', 'r');
$line = fgets($handle);
// exchange the verifier for the keys
$verifier = trim($line);
$resp = $requestHandler->request('POST', 'oauth/access_token', array('oauth_verifier' => $verifier));
$out = $result = $resp->body;
$data = array();
parse_str($out, $data);
// and print out our new keys
$token = $data['oauth_token'];
$secret = $data['oauth_token_secret'];
echo "\ntoken: " . $token . "\nsecret: " . $secret;
// and prove we're in the money
$client = new Tumblr\API\Client($consumerKey, $consumerSecret, $token, $secret);
$info = $client->getUserInfo();
echo "\ncongrats " . $info->user->name . "!\n";