【问题标题】:Zend OAuth with twitter single access tokensZend OAuth 与 twitter 单一访问令牌
【发布时间】:2011-03-26 06:23:36
【问题描述】:
我正在开发一个应用程序,它要求用户使用 twitter 和 OAuth 登录。多亏了 Zend_OAuth,一切都运行良好。问题是 Web 应用程序也会对 twitter API 进行一些调用,但这些调用将在内部处理,无需进行身份验证。 Twitter 开发人员为此提供了“access_token”和“access_token_secret”密钥(在此提及http://dev.twitter.com/pages/oauth_single_token)
问题是我无法让 Zend_OAuth 与现有的访问令牌一起使用。有没有人可以通过几行代码提供帮助,我如何使用现有密钥进行 API 调用而不被重定向到 Twitter 的授权页面?我知道这是可以做到的。
附言。如果可能,我不想使用 dev.twitter.com 中提到的外部库——这正是 Zend Framework 提供的
谢谢!
【问题讨论】:
标签:
php
api
zend-framework
twitter
oauth
【解决方案1】:
使用 ZF 1.10.8 版,在 Twitter 上发布所需的最少代码是:
$token = new Zend_Oauth_Token_Access;
$token->setParams(array(
'oauth_token' => 'REPLACE_WITH_TOKEN',
'oauth_token_secret' => 'REPLACE_WITH_TOKEN_SECRET'
));
$twitter = new Zend_Service_Twitter(array(
'consumerKey' => 'REPLACE_WITH_CONSUMER_KEY',
'consumerSecret' => 'REPLACE_WITH_CONSUMER_SECRET',
'accessToken' => $token
));
$response = $twitter->status->update('REPLACE WITH MESSAGE');
在http://dev.twitter.com注册您的应用程序后,可以访问所有令牌和秘密
【解决方案2】:
在从 db 存储的令牌和令牌秘密组件重新生成 access_token obj 之后(正如 Justin 所示),您也可以根据您的 Twitter 需求绕过 Zend_Oauth_Consumer 和 Zend_Service_Twitter 并使用 Zend_Oauth_Token_Access 提供的 Zend_Http_Client。这适用于简单的状态发布 - 如下所示:
$token = new Zend_Oauth_Token_Access();
$token->setToken('singletoken');
$token->setTokenSecret('singlesecret');
$client = $token->getHttpClient(array('requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0',
'signatureMethod' => 'HMAC-SHA1',
'callbackUrl' => 'http://example.org/dummyurl',
'requestTokenUrl' => 'http://twitter.com/oauth/request_token',
'accessTokenUrl' => 'http://twitter.com/oauth/access_token',
'userAuthorizationUrl' => 'http://twitter.com/oauth/authorize',
'consumerKey' => 'yourconsumerkey',
'ConsumerSecret' => 'yourconsumersecret',
));
$client->setUri('http://twitter.com/statuses/update.json');
$client->setMethod(Zend_Http_Client::POST);
$client->setParameterPost('status', $_POST["tweet_text"]);
$response = $client->request();
$data = Zend_Json::decode( $response->getBody(), Zend_Json::TYPE_OBJECT);
if($data->text) { /* success */ }
【解决方案3】:
$token = new Zend_Oauth_Token_Access();
$token->setToken('singletoken');
$token->setTokenSecret('singlesecret');
$consumer = new Zend_Oauth_Consumer(
array('requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0',
'signatureMethod' => 'HMAC-SHA1',
'callbackUrl' => 'http://example.org/dummyurl',
'requestTokenUrl' => 'http://twitter.com/oauth/request_token',
'accessTokenUrl' => 'http://twitter.com/oauth/access_token',
'userAuthorizationUrl' => 'http://twitter.com/oauth/authorize',
'consumerKey' => 'yourconsumerkey',
'ConsumerSecret' => 'yourconsumersecret',
));
$twtr = new Zend_Service_Twitter(array('accessToken'=>$token), $consumer);
应该这样做。
【解决方案4】:
如果代码示例不起作用,请尝试将“ConsumerSecret”的大小写更改为“consumerSecret”。我花了几个小时才抓住这个。希望它能节省您的时间。