First of all, I am able to successfully authenticate using Oauth. I am using Padraic\'s tutorial found here: http://blog.astrumfutura.com/archives/411-Writing-A-Simple-Twitter-C
We've done almost exactly this for Twitgoo.com (runnining full zend framework and twitter oauth login integration).
To generalize, we created two Zend_Auth_Identity
models - one for password login one for oauth login. (actually 3 where 1 is 'anon' and fails all Zend_Auth
). The identity holds the username and our local userid at minimum - for oauth it holds the Zend_Oauth_Token
, for password it holds the password (we never store it). These identity models are what the Zend_Auth_Adapter
for twitter returns, and what we pass to our Zend_Service_Twitter
extension.
our twitter then takes in a Identity model, and handles setting up twitter for it.
class Tg_Service_Twitter extends Zend_Service_Twitter {
public function __construct(Tg_Auth_Identity $login) {
if ($login instanceof Tg_Auth_Identity_Password) {
$password = $login->getPassword();
} else if ($login instanceof Tg_Auth_Identity_Oauth) {
$password = null;
$httpClient = $login->getOauthToken()
->getHttpClient(Tg_Service_Twitter_Helper::getOauthOptions());
self::setHttpClient($httpClient);
} else {
throw new Exception('not done yet');
}
$username = $login->getUsername();
self::setupHttpClient();
parent::__construct($username, $password);
if ($login instanceof Tg_Auth_Identity_Oauth) {
//makes it skip basic auth
$this->_authInitialized = true;
}
}
The $username is required to be set from the login (which twitter gives back to you during getting access token) by some of the Service_Twitter functions.
I can add more specifics if needed.
Okay, I placed a bounty on this question and I do not know how to remove it. I am going to answer it myself. For others to know if they are encountering the same problem.
First, in my application.ini I have something like this:
oauth.version = "1.0"
oauth.signatureMethod = "HMAC-SHA1"
oauth.requestScheme = "header"
oauth.siteUrl = "http://mysite.com/twitter/public"
oauth.callbackUrl = "http://mysite.com/twitter/public/login/callback"
oauth.requestTokenUrl = "http://twitter.com/oauth/request_token"
oauth.authorizeUrl = "http://twitter.com/oauth/authorize"
oauth.accessTokenUrl = "http://twitter.com/oauth/access_token"
oauth.consumerKey = "xxxxxx"
oauth.consumerSecret = "xxxxxxxxxx"
Then, my new model is this:
<?php
/**
* I'm trying to extend Zend_Service_Twitter to use Oauth instead
*/
require_once 'Zend/Service/Twitter.php';
class Mytwitterapp_Twitteroauth extends Zend_Service_Twitter
{
/**
* Oauth
* @var Zend_Oauth_Token_Access
*/
protected $_token;
/**
* Array for Zend_Oauth_Consumer (i think)
* @var Zend_Config_Ini
*/
protected $_config;
/**
* @param object $token
* @return void
*/
public function __construct(Zend_Oauth_Token_Access $token)
{
$this->_config = new Zend_Config_Ini(APPLICATION_INI, APPLICATION_ENV);
$this->_token = $token;
$this->setUri('http://twitter.com');
//$this->_authInitialized = true;
self::setHttpClient($token->getHttpClient($this->_config->oauth->toArray()));
}
}
Using it would look something like this:
$oauth = new Zend_Session_Namespace('Twitter_Oauth');
$token = unserialize($oauth->twitter_access_token);
$this->_twitter = new Mytwitterapp_Twitteroauth($token);
Man, thanks for this. Was just about losing my mind on a new project that already had a bunch of Zend_Service_Twitter
calls in it.