Created
October 31, 2013 11:09
-
-
Save trustmaster/7247964 to your computer and use it in GitHub Desktop.
Modified Odnoklassniki adapter for HybridAuth with setUserStatus() method support.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/*! | |
* HybridAuth | |
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth | |
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html | |
*/ | |
/** | |
* Hybrid_Providers_Odnoklassniki provider adapter based on OAuth2 protocol | |
* | |
*/ | |
class Hybrid_Providers_Odnoklassniki extends Hybrid_Provider_Model_OAuth2 | |
{ | |
/** | |
* IDp wrappers initializer | |
*/ | |
function initialize() | |
{ | |
parent::initialize(); | |
// Provider apis end-points | |
$this->api->api_base_url = "http://api.odnoklassniki.ru/fb.do"; | |
$this->api->authorize_url = "http://www.odnoklassniki.ru/oauth/authorize"; | |
$this->api->token_url = "http://api.odnoklassniki.ru/oauth/token.do"; | |
$this->api->sign_token_name = "access_token"; | |
} | |
private function request( $url, $params=false, $type="GET" ) | |
{ | |
Hybrid_Logger::info( "Enter OAuth2Client::request( $url )" ); | |
Hybrid_Logger::debug( "OAuth2Client::request(). dump request params: ", serialize( $params ) ); | |
if( $type == "GET" ){ | |
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query( $params ); | |
} | |
$this->http_info = array(); | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL , $url ); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 ); | |
curl_setopt($ch, CURLOPT_TIMEOUT , $this->curl_time_out ); | |
curl_setopt($ch, CURLOPT_USERAGENT , $this->curl_useragent ); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->curl_connect_time_out ); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->curl_ssl_verifypeer ); | |
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->curl_header ); | |
if($this->curl_proxy){ | |
curl_setopt( $ch, CURLOPT_PROXY , $this->curl_proxy); | |
} | |
if( $type == "POST" ){ | |
curl_setopt($ch, CURLOPT_POST, 1); | |
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params ); | |
} | |
$response = curl_exec($ch); | |
Hybrid_Logger::debug( "OAuth2Client::request(). dump request info: ", serialize( curl_getinfo($ch) ) ); | |
Hybrid_Logger::debug( "OAuth2Client::request(). dump request result: ", serialize( $response ) ); | |
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); | |
$this->http_info = array_merge($this->http_info, curl_getinfo($ch)); | |
curl_close ($ch); | |
return $response; | |
} | |
private function parseRequestResult( $result ) | |
{ | |
if( json_decode( $result ) ) return json_decode( $result ); | |
parse_str( $result, $ouput ); | |
$result = new StdClass(); | |
foreach( $ouput as $k => $v ) | |
$result->$k = $v; | |
return $result; | |
} | |
function authodnoklass( $code ) | |
{ | |
$params = array( | |
"client_id" => $this->api->client_id, | |
"client_secret" => $this->api->client_secret, | |
"grant_type" => "authorization_code", | |
"redirect_uri" => $this->api->redirect_uri, | |
"code" => $code, | |
"scope" => $this->config['scope'] | |
); | |
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), $this->api->curl_authenticate_method ); | |
$response = $this->parseRequestResult( $response ); | |
if( ! $response || ! isset( $response->access_token ) ){ | |
throw new Exception( "The Authorization Service has return: " . $response->error ); | |
} | |
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token; | |
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token; | |
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in; | |
// calculate when the access token expire | |
$this->api->access_token_expires_at = time() + $response->expires_in; | |
return $response; | |
} | |
function loginFinish() | |
{ | |
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:""; | |
// check for errors | |
if ( $error ){ | |
throw new Exception( "Authentification failed! {$this->providerId} returned an error: $error", 5 ); | |
} | |
// try to authenicate user | |
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:""; | |
try{ | |
$this->authodnoklass( $code ); | |
} | |
catch( Exception $e ){ | |
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 ); | |
} | |
// check if authenticated | |
if ( ! $this->api->access_token ){ | |
throw new Exception( "Authentification failed! {$this->providerId} returned an invalid access token.", 5 ); | |
} | |
// store tokens | |
$this->token( "access_token" , $this->api->access_token ); | |
$this->token( "refresh_token", $this->api->refresh_token ); | |
$this->token( "expires_in" , $this->api->access_token_expires_in ); | |
$this->token( "expires_at" , $this->api->access_token_expires_at ); | |
// set user connected locally | |
$this->setUserConnected(); | |
} | |
/** | |
* load the user profile from the IDp api client | |
*/ | |
function getUserProfile() | |
{ | |
$sig = md5('application_key=' . $this->config['keys']['key'] . 'method=users.getCurrentUser' . md5($this->api->access_token . $this->api->client_secret)); | |
$response = $this->api->api( '?application_key=' . $this->config['keys']['key'] . '&method=users.getCurrentUser&sig=' .$sig); | |
if ( ! isset( $response->uid ) ){ | |
throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 ); | |
} | |
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:""; | |
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:""; | |
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:""; | |
$this->user->profile->displayName = (property_exists($response,'name'))?$response->name:""; | |
$this->user->profile->avatarURL = (property_exists($response,'pic_1'))?$response->pic_1:""; | |
$this->user->profile->photoURL = (property_exists($response,'pic_2'))?$response->pic_2:""; | |
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"http://www.odnoklassniki.ru/profile/".$response->uid; | |
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:""; | |
$this->user->profile->email = (property_exists($response,'email'))?$response->email:""; | |
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:""; | |
if( property_exists($response,'birthday') ){ | |
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday ); | |
$this->user->profile->birthDay = (int) $birthday_day; | |
$this->user->profile->birthMonth = (int) $birthday_month; | |
$this->user->profile->birthYear = (int) $birthday_year; | |
} | |
return $this->user->profile; | |
} | |
/** | |
* update user status | |
*/ | |
function setUserStatus( $status ) | |
{ | |
$sig = md5('application_key=' . $this->config['keys']['key'] . 'method=users.setStatusstatus='.$status/*.'uid='.$this->user->profile->identifier */. md5($this->api->access_token . $this->api->client_secret)); | |
$response = $this->api->api( '?application_key=' . $this->config['keys']['key'] . '&method=users.setStatus&status=' . urlencode($status) . /*'&uid=' . $this->user->profile->identifier .*/ '&sig=' .$sig); | |
if ( isset( $response->error_code ) ){ | |
throw new Exception( "User status request failed! {$this->providerId} returned an invalide response: {$response->error_msg}", 6 ); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment