/** * Request an instance of the OAuthStore */ public static function instance($store = 'MySQL', $options = array()) { if (!OAuthStore::$instance) { // Select the store you want to use if (strpos($store, '/') === false) { $class = 'OAuthStore' . $store; $file = dirname(__FILE__) . '/store/' . $class . '.php'; } else { $file = $store; $store = basename($file, '.php'); $class = $store; } if (is_file($file)) { require_once $file; if (class_exists($class)) { OAuthStore::$instance = new $class($options); } else { throw new OAuthException2('Could not find class ' . $class . ' in file ' . $file); } } else { throw new OAuthException2('No OAuthStore for ' . $store . ' (file ' . $file . ')'); } } return OAuthStore::$instance; }
/** * Construct the request to be signed. Parses or appends the parameters in the params url. * When you supply an params array, then the params should not be urlencoded. * When you supply a string, then it is assumed it is of the type application/x-www-form-urlencoded * * @param string request url * @param string method PUT, GET, POST etc. * @param mixed params string (for urlencoded data, or array with name/value pairs) * @param string body optional body for PUT and/or POST requests */ function __construct($request, $method = null, $params = null, $body = null) { $this->store = OAuthStore::instance(); if (is_string($params)) { parent::__construct($request, $method, $params); } else { parent::__construct($request, $method); if (is_array($params)) { foreach ($params as $name => $value) { $this->setParam($name, $value); } } } // With put/ post we might have a body (not for application/x-www-form-urlencoded requests) if (strcasecmp($method, 'PUT') == 0 || strcasecmp($method, 'POST') == 0) { $this->setBody($body); } }
/** * Request an access token from the site belonging to consumer_key. * Before this we got an request token, now we want to exchange it for * an access token. * * @param string consumer_key * @param string token * @param int usr_id user requesting the access token * @param string method (optional) change the method of the request, defaults to POST (as it should be) * @param array options (optional) extra options for request, eg token_ttl * @param array curl_options optional extra options for curl request * * @exception OAuthException2 when no key could be fetched * @exception OAuthException2 when no server with consumer_key registered */ static function requestAccessToken($consumer_key, $token, $usr_id, $method = 'POST', $options = array(), $curl_options = array()) { OAuthRequestLogger::start(); $store = OAuthStore::instance(); $r = $store->getServerTokenSecrets($consumer_key, $token, 'request', $usr_id); $uri = $r['access_token_uri']; $token_name = $r['token_name']; // Delete the server request token, this one was for one use only $store->deleteServerToken($consumer_key, $r['token'], 0, true); // Try to exchange our request token for an access token $oauth = new OAuthRequester($uri, $method); if (isset($options['oauth_verifier'])) { $oauth->setParam('oauth_verifier', $options['oauth_verifier']); } if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) { $oauth->setParam('xoauth_token_ttl', intval($options['token_ttl'])); } OAuthRequestLogger::setRequestObject($oauth); $oauth->sign($usr_id, $r, '', 'accessToken'); $text = $oauth->curl_raw($curl_options); if (empty($text)) { throw new OAuthException2('No answer from the server "' . $uri . '" while requesting an access token'); } $data = $oauth->curl_parse($text); if ($data['code'] != 200) { throw new OAuthException2('Unexpected result from the server "' . $uri . '" (' . $data['code'] . ') while requesting an access token'); } $token = array(); $params = explode('&', $data['body']); foreach ($params as $p) { @(list($name, $value) = explode('=', $p, 2)); $token[$oauth->urldecode($name)] = $oauth->urldecode($value); } if (!empty($token['oauth_token']) && !empty($token['oauth_token_secret'])) { $opts = array(); $opts['name'] = $token_name; if (isset($token['xoauth_token_ttl'])) { $opts['token_ttl'] = $token['xoauth_token_ttl']; } $store->addServerToken($consumer_key, 'access', $token['oauth_token'], $token['oauth_token_secret'], $usr_id, $opts); } else { throw new OAuthException2('The server "' . $uri . '" did not return the oauth_token or the oauth_token_secret'); } OAuthRequestLogger::flush(); }