Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Yandex OAuth2 Provider
 *
 * @package    CodeIgniter/OAuth2
 * @category   Provider
 * @author     Lavr Lyndin
 */

class OAuth2_Provider_Yandex extends OAuth2_Provider
{
        public $method = 'POST';
        
        public function url_authorize()
        {
                return 'https://oauth.yandex.ru/authorize';
        }

        public function url_access_token()
        {
                return 'https://oauth.yandex.ru/token';
        }

        public function get_user_info(OAuth2_Token_Access $token)
        {
                $opts = array(
                        'http' => array(
                                'method' => 'GET',
                                'header' => 'Authorization: OAuth '.$token->access_token
                        )
                );
                $_default_opts = stream_context_get_params(stream_context_get_default());
                
                $opts = array_merge_recursive($_default_opts['options'], $opts);
                $context = stream_context_create($opts);
                $url = 'http://api-yaru.yandex.ru/me/?format=json';

                $user = json_decode(file_get_contents($url,false,$context));

                preg_match("/\d+$/",$user->id,$uid);
                
                return array(
                        'uid' => $uid[0],
                        'nickname' => isset($user->name) ? $user->name : null,
                        'name' => isset($user->name) ? $user->name : null,
                        'first_name' => isset($user->first_name) ? $user->first_name : null,
                        'last_name' => isset($user->last_name) ? $user->last_name : null,
                        'email' => isset($user->email) ? $user->email : null,
                        'location' => isset($user->hometown->name) ? $user->hometown->name : null,
                        'description' => isset($user->bio) ? $user->bio : null,
                        'image' => $user->links->userpic,
                );
        }
        
        public function access($code, $options = array())
        {
                $params = array(
                        'client_id'     => $this->client_id,
                        'client_secret' => $this->client_secret,
                        'grant_type'    => isset($options['grant_type']) ? $options['grant_type'] : 'authorization_code',
                );

                switch ($params['grant_type'])
                {
                        case 'authorization_code':
                                $params['code'] = $code;
                                $params['redirect_uri'] = isset($options['redirect_uri']) ? $options['redirect_uri'] : $this->redirect_uri;
                        break;

                        case 'refresh_token':
                                $params['refresh_token'] = $code;
                        break;
                }

                $response = null;       
                $url = $this->url_access_token();

                $curl = curl_init($url);

                $headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8;';
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

//              curl_setopt($curl, CURLOPT_USERAGENT, 'yamolib-php');
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
                curl_setopt($curl, CURLOPT_TIMEOUT, 80);
                curl_setopt($curl, CURLOPT_POST, true);
                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
                //        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
                //        curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/../data/ca-certificate.crt');

                $response = curl_exec($curl);
                curl_close($curl);

                $return = json_decode($response, true);

                if ( ! empty($return['error']))
                {
                        throw new OAuth2_Exception($return);
                }

                switch ($params['grant_type'])
                {
                        case 'authorization_code':
                                return OAuth2_Token::factory('access', $return);
                        break;

                        case 'refresh_token':
                                return OAuth2_Token::factory('refresh', $return);
                        break;
                }
        }

}