Zend Framework: Zend_Oauth and Zend_Service_Twitter

后端 未结 3 571
慢半拍i
慢半拍i 2021-02-06 14:57

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

相关标签:
3条回答
  • 2021-02-06 15:40

    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.

    0 讨论(0)
  • 2021-02-06 15:49

    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);
    
    0 讨论(0)
  • 2021-02-06 15:56

    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.

    0 讨论(0)
提交回复
热议问题