<?php /** * HybridAuth * http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth * (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html */ // A service client for the OAuth 1/1.0a flow. // v0.1 class OAuth1Client{ public $api_base_url = ""; public $authorize_url = ""; public $authenticate_url = ""; public $request_token_url = ""; public $access_token_url = ""; public $request_token_method = "GET"; public $access_token_method = "GET"; public $redirect_uri = ""; public $decode_json = true; public $curl_time_out = 30; public $curl_connect_time_out = 30; public $curl_ssl_verifypeer = false; public $curl_auth_header = true; public $curl_useragent = "OAuth/1 Simple PHP Client v0.1; HybridAuth http://hybridauth.sourceforge.net/"; public $curl_proxy = null; //-- public $http_code = ""; public $http_info = ""; protected $response = null; /** * OAuth client constructor */ function __construct( $consumer_key, $consumer_secret, $oauth_token = null, $oauth_token_secret = null ) { $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); $this->consumer = new OAuthConsumer( $consumer_key, $consumer_secret ); $this->token = null; if ( $oauth_token && $oauth_token_secret ){ $this->token = new OAuthConsumer( $oauth_token, $oauth_token_secret ); } } /** * Build authorize url * * @return string */ function authorizeUrl( $token, $extras =array() ) { if ( is_array( $token ) ){ $token = $token['oauth_token']; } $parameters = array( "oauth_token" => $token ); if( count($extras) ) foreach( $extras as $k=>$v ) $parameters[$k] = $v; return $this->authorize_url . "?" . http_build_query( $parameters ); } /** * Get a request_token from provider * * @return array a key/value array containing oauth_token and oauth_token_secret */ function requestToken( $callback = null ) { $parameters = array(); if ( $callback ) { $this->redirect_uri = $parameters['oauth_callback'] = $callback; } $request = $this->signedRequest( $this->request_token_url, $this->request_token_method, $parameters ); $token = OAuthUtil::parse_parameters( $request ); $this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] ); return $token; } /** * Exchange the request token and secret for an access token and secret, to sign API calls. * * @return array array('oauth_token' => the access token, 'oauth_token_secret' => the access secret) */ function accessToken( $oauth_verifier = false, $oauth_token = false ) { $parameters = array(); // 1.0a if ( $oauth_verifier ) { $parameters['oauth_verifier'] = $oauth_verifier; } $request = $this->signedRequest( $this->access_token_url, $this->access_token_method, $parameters ); $token = OAuthUtil::parse_parameters( $request ); $this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] ); return $token; } /** * GET wrapper for provider apis request */ function get($url, $parameters = array(), $content_type = null) { return $this->api($url, 'GET', $parameters, null, $content_type); } /** * POST wrapper for provider apis request */ function post($url, $parameters = array(), $body = null, $content_type = null, $multipart = false) { return $this->api($url, 'POST', $parameters, $body, $content_type, $multipart ); } /** * Format and sign an oauth for provider api */ function api( $url, $method = 'GET', $parameters = array(), $body = null, $content_type = null, $multipart = false ) { if ( strrpos($url, 'http://') !== 0 && strrpos($url, 'https://') !== 0 ) { $url = $this->api_base_url . $url; } $response = $this->signedRequest( $url, $method, $parameters, $body, $content_type, $multipart ); if( $this->decode_json ){ $response = json_decode( $response ); } return $this->response = $response; } /** * Return the response object afer the fact * * @return mixed */ public function getResponse() { return $this->response; } /** * Make signed request */ function signedRequest( $url, $method, $parameters, $body = null, $content_type = null, $multipart = false ) { $signature_parameters = array(); // when making a multipart request, use only oauth_* keys for signature foreach( $parameters AS $key => $value ){ if( !$multipart || strpos( $key, 'oauth_' ) === 0 ){ $signature_parameters[$key] = $value; } } $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $signature_parameters); $request->sign_request($this->sha1_method, $this->consumer, $this->token); switch ($method) { case 'GET': return $this->request( $request->to_url(), 'GET', null, null, $content_type ); default : if ($body) return $this->request( $request->to_url(), $method, $body, $request->to_header(), $content_type ); else return $this->request( $request->get_normalized_http_url(), $method, ($multipart ? $parameters : $request->to_postdata()), $request->to_header(), $content_type, $multipart ) ; } } /** * Make http request */ function request( $url, $method, $postfields = null, $auth_header = null, $content_type = null, $multipart = false ) { Hybrid_Logger::info( "Enter OAuth1Client::request( $method, $url )" ); Hybrid_Logger::debug( "OAuth1Client::request(). dump post fields: ", serialize( $postfields ) ); $this->http_info = array(); $ci = curl_init(); /* Curl settings */ curl_setopt( $ci, CURLOPT_USERAGENT , $this->curl_useragent ); curl_setopt( $ci, CURLOPT_CONNECTTIMEOUT, $this->curl_connect_time_out ); curl_setopt( $ci, CURLOPT_TIMEOUT , $this->curl_time_out ); curl_setopt( $ci, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ci, CURLOPT_HTTPHEADER , array('Expect:') ); curl_setopt( $ci, CURLOPT_SSL_VERIFYPEER, $this->curl_ssl_verifypeer ); curl_setopt( $ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader') ); curl_setopt( $ci, CURLOPT_HEADER , false ); if( $multipart ){ curl_setopt( $ci, CURLOPT_HTTPHEADER, array( 'Expect:', $auth_header ) ); }elseif ($content_type) curl_setopt( $ci, CURLOPT_HTTPHEADER, array('Expect:', "Content-Type: $content_type") ); if($this->curl_proxy){ curl_setopt( $ci, CURLOPT_PROXY , $this->curl_proxy); } switch ($method){ case 'POST': curl_setopt( $ci, CURLOPT_POST, true ); if ( !empty($postfields) ){ curl_setopt( $ci, CURLOPT_POSTFIELDS, $postfields ); } if ( !empty($auth_header) && $this->curl_auth_header && !$multipart ){ curl_setopt( $ci, CURLOPT_HTTPHEADER, array( 'Content-Type: application/atom+xml', $auth_header ) ); } break; case 'DELETE': curl_setopt( $ci, CURLOPT_CUSTOMREQUEST, 'DELETE' ); if ( !empty($postfields) ){ $url = "{$url}?{$postfields}"; } } curl_setopt($ci, CURLOPT_URL, $url); $response = curl_exec($ci); if( $response === false ) { Hybrid_Logger::error( "OAuth1Client::request(). curl_exec error: ", curl_error($ci) ); } Hybrid_Logger::debug( "OAuth1Client::request(). dump request info: ", serialize( curl_getinfo($ci) ) ); Hybrid_Logger::debug( "OAuth1Client::request(). dump request result: ", serialize( $response ) ); $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); curl_close ($ci); return $response; } /** * Get the header info to store. */ function getHeader($ch, $header) { $i = strpos($header, ':'); if ( !empty($i) ){ $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); $value = trim(substr($header, $i + 2)); $this->http_header[$key] = $value; } return strlen($header); } }