2013-12-10 4 views
1

Это мой первый раз, работая с API к LinkedIn и я пытаюсь следовать этому примеру в официальной документации:Linkedin PHP апи не установив маркер доступа в CodeIgniter

[http://developer.linkedin.com/documents/code-samples][1] 

Я реорганизованный, что же процедурный код в класс контроллера CodeIgniter называется Auth:

<?php if (!defined('BASEPATH')) die(); 

class Auth extends CI_Controller 
{ 

    public function __construct() 
    { 

     parent::__construct(); 

     define('API_KEY',  $this->config->item('key')); 
     define('API_SECRET', $this->config->item('secret')); 
     define('REDIRECT_URI', 'http://' . $_SERVER['SERVER_NAME'] . ':8000/auth'); 
     define('SCOPE',  'r_basicprofile r_emailaddress rw_groups'); 

    } 

    public function index() 
    { 
     var_dump($this->session->all_userdata()); 
     if (!empty($this->session->userdata('state'))) { 
     $user = $this->fetch('GET', '/v1/people/~:(firstName,lastName)'); 
     print "Hello $user->firstName $user->lastName."; 
     } else { 
     // $this->session->sess_destroy(); 
     echo anchor('auth/oauth', 'Sign in with Linkedin'); 
     } 

    } 


    public function oauth() 
    { 
     // OAuth 2 Control Flow 
     if (isset($_GET['error'])) { 
      // LinkedIn returned an error 
      print $_GET['error'] . ': ' . $_GET['error_description']; 
      exit; 
     } elseif (isset($_GET['code'])) { 
      // User authorized your application 
      if ($this->session->userdata('state') == $_GET['state']) { 
       // Get token so you can make API calls 
       $this->getAccessToken(); 
      } else { 
       // CSRF attack? Or did you mix up your states? 
       exit; 
      } 
     } else { 
      if ((empty($this->session->userdata('expires_at'))) || (time() > $this->session->userdata('expires_at'))) { 
       // Token has expired, clear the state 
       $this->session->sess_destroy(); 
      } 
      if (empty($this->session->userdata('access_token'))) { 
       echo "here I am"; 
       // Start authorization process 
       $this->getAuthorizationCode(); 
      } 
     } 

    } 

    protected function getAccessToken() { 
     $params = array('grant_type' => 'authorization_code', 
         'client_id' => API_KEY, 
         'client_secret' => API_SECRET, 
         'code' => $_GET['code'], 
         'redirect_uri' => REDIRECT_URI, 
       ); 

     // Access Token request 
     $url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params); 

     // Tell streams to make a POST request 
     $context = stream_context_create(
         array('http' => 
          array('method' => 'POST', 
          ) 
         ) 
        ); 

     // Retrieve access token information 
     $response = file_get_contents($url, false, $context); 
     // Native PHP object, please 
     $token = json_decode($response); 

     // Store access token and expiration time 

     // $_SESSION['access_token'] = $token->access_token; // guard this! 
     // $_SESSION['expires_in'] = $token->expires_in; // relative time (in seconds) 
     // $_SESSION['expires_at'] = time() + $_SESSION['expires_in']; // absolute time 

     $this->session->set_userdata('access_token', $token->access_token); 
     $this->session->set_userdata('expires_in', $token->expires_in); 
     $this->session->set_userdata('expires_at', time() + $this->session->userdata('expires_in')); 

     return true; 
    } 

    protected function getAuthorizationCode() { 
     $params = array('response_type' => 'code', 
         'client_id' => API_KEY, 
         'scope' => SCOPE, 
         'state' => uniqid('', true), // unique long string 
         'redirect_uri' => REDIRECT_URI, 
       ); 

     // Authentication request 
     $url = 'https://www.linkedin.com/uas/oauth2/authorization?' . http_build_query($params); 

     // Needed to identify request when it returns to us 
     // $_SESSION['state'] = $params['state']; 
     $this->session->set_userdata('state', $params['state']); 

     // Redirect user to authenticate 
     redirect($url); 
    } 


    protected function fetch($method, $resource, $body = '') { 
     $params = array('oauth2_access_token' => $this->session->userdata('access_token'), 
         'format' => 'json', 
       ); 

     // Need to use HTTPS 
     $url = 'https://api.linkedin.com' . $resource . '?' . http_build_query($params); 
     // Tell streams to make a (GET, POST, PUT, or DELETE) request 
     $context = stream_context_create(
         array('http' => 
          array('method' => $method, 
          ) 
         ) 
        ); 


     // Hocus Pocus 
     $response = file_get_contents($url, false, $context); 

     // Native PHP object, please 
     return json_decode($response); 
    } 

    public function logout() 
    { 
     $_SESSION = array(); 
     $this->load->view('comment_index'); 
    } 

} 

Я использую базу данных для хранения сессий, и я ожидал access_token быть одним из значений, хранящихся в моем сериализованном поле называется user_data , Но я ничего не получаю. Выход текущего сеанса:

array (size=5) 
    'session_id' => string '1dfcbc17bf0346424726c7cace63501b' (length=32) 
    'ip_address' => string '`127.0.0.1`' (length=9) 
    'user_agent' => string 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0' (length=81) 
    'last_activity' => int 1386687134 
    'user_data' => string '' (length=0) 

Я не понимаю, почему linkedin не возвращает мне токены для хранения. Из-за redirect_url я тоже не могу отлаживать этот код. Пока что работает это:

  1. Пользователь перенаправляется в окно авторизации с этим ур: https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=75y11f289134ga&scope=r_basicprofile+r_emailaddress+rw_groups&state=52a72cc4e54f36.03304050&redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fauth

  2. Пользователь перенаправляется на auth действия без каких-либо ошибок с этим URL: http://127.0.0.1:8000/auth? код = AQTWPFJqnZlBZmFByb3Vbjkf4jtNvn8C7atg5iM6iXFW3ON_SrM3uJ9h8AiF1RbMjgGt_NpDq4cTPL1qw8uNiA_vsOv1H3lpxu0IxHVx_sa9rDAinbo & состояние = 52a72d109261d4.41607693

Но где мои данные профиля? Как и где я делаю вызов api для извлечения данных профиля? Пожалуйста, помогите

ответ

4

Я делаю то же самое в Codeigniter.

Вот процедура получения профиля пользователя Auth.

  1. Создание библиотеки для Linkedin

    defined('BASEPATH') OR exit('No direct script access allowed'); 
    
    /** 
    * CodeIgniter Linked API Class 
    * 
    * 
    * @package   CodeIgniter 
    * @subpackage  Libraries 
    * @category  Libraries 
    * @author   Muhamamd Hafeez 
    */ 
    class Linkedin { 
    
        function __construct(){ 
    
        } 
    
        public function getAuthorizationCode() { 
         $params = array('response_type' => 'code', 
          'client_id' => API_KEY, 
          'scope' => SCOPE, 
          'state' => uniqid('', true), // unique long string 
          'redirect_uri' => REDIRECT_URI, 
         ); 
         // Authentication request 
         $url = 'https://www.linkedin.com/uas/oauth2/authorization?' . http_build_query($params); 
    
         // Needed to identify request when it returns to us 
         $_SESSION['state'] = $params['state']; 
    
         // Redirect user to authenticate 
         header("Location: $url"); 
         exit; 
        } 
    
        public function getAccessToken() { 
         $params = array('grant_type' => 'authorization_code', 
          'client_id' => API_KEY, 
          'client_secret' => API_SECRET, 
          'code' => $_GET['code'], 
          'redirect_uri' => REDIRECT_URI, 
         ); 
         // Access Token request 
         $url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params); 
    
         // Tell streams to make a POST request 
         $context = stream_context_create(
           array('http' => 
            array('method' => 'POST', 
            ) 
           ) 
         ); 
    
         // Retrieve access token information 
         $response = file_get_contents($url, false, $context); 
    
         // Native PHP object, please 
         $token = json_decode($response); 
    
         // Store access token and expiration time 
         $_SESSION['access_token'] = $token->access_token; // guard this! 
         $_SESSION['expires_in'] = $token->expires_in; // relative time (in seconds) 
         $_SESSION['expires_at'] = time() + $_SESSION['expires_in']; // absolute time 
         return true; 
        } 
    
        public function fetch($method, $resource, $body = '') { 
         $params = array('oauth2_access_token' => $_SESSION['access_token'], 
          'format' => 'json', 
         ); 
    
         // Need to use HTTPS 
         $url = 'https://api.linkedin.com' . $resource . '?' . http_build_query($params); 
         // Tell streams to make a (GET, POST, PUT, or DELETE) request 
         $context = stream_context_create(
           array('http' => 
            array('method' => $method, 
            ) 
           ) 
         ); 
    
    
         // Hocus Pocus 
         $response = file_get_contents($url, false, $context); 
    
         // Native PHP object, please 
         return json_decode($response); 
        } 
    
    } 
    
    /* End of file Linked.php */ 
    /* Location: ./application/libraries/linkedin.php */ 
    
  2. Поместите все свои Константы вещи в Конфин/constants.php

    define('API_KEY', 'Put Yoour API_KEY here'); 
    define('API_SECRET', 'Put Yoour API_SECRET here'); 
    define('REDIRECT_URI', 'Put Yoour REDIRECT_URI here'); 
    define('SCOPE', 'r_fullprofile r_emailaddress rw_nus r_contactinfo r_network'); 
    
  3. Теперь контроллер

    class Profile extends CI_Controller { 
    
        function __construct() { 
         parent:: __construct(); 
         $this->load->library('linkedin'); // load library 
         session_name('linkedin'); 
         session_start(); 
        } 
    
        // linkedin login script 
        function profile() { 
         // OAuth 2 Control Flow 
         if (isset($_GET['error'])) { 
          // LinkedIn returned an error 
          // load any error view here 
          exit; 
         } elseif (isset($_GET['code'])) { 
          // User authorized your application 
          if ($_SESSION['state'] == $_GET['state']) { 
           // Get token so you can make API calls 
           $this->linkedin->getAccessToken(); 
          } else { 
    
           // CSRF attack? Or did you mix up your states? 
           exit; 
          } 
         } else { 
          if ((empty($_SESSION['expires_at'])) || (time() > $_SESSION['expires_at'])) { 
           // Token has expired, clear the state 
           $_SESSION = array(); 
          } 
          if (empty($_SESSION['access_token'])) { 
           // Start authorization process 
           $this->linkedin->getAuthorizationCode(); 
          } 
         } 
         // define the array of profile fields 
         $profile_fileds = array(
          'id', 
          'firstName', 
          'maiden-name', 
          'lastName', 
          'picture-url', 
          'email-address', 
          'location:(country:(code))', 
          'industry', 
          'summary', 
          'specialties', 
          'interests', 
          'public-profile-url', 
          'last-modified-timestamp', 
          'num-recommenders', 
          'date-of-birth', 
         ); 
         $profileData = $this->linkedin->fetch('GET', '/v1/people/~:(' . implode(',', $profile_fileds) . ')'); 
         if ($profileData) { 
          // save profile or do whatever you want 
         } else { 
          // linked return an empty array of profile data 
         } 
        } 
    
    } 
    
+0

Благодарим за внесение этого кода. Я проверю это и вернусь к вам. –

+0

Я использовал этот код .. но когда я пытаюсь сохранить $ profileData в sesion, он не работает. Пожалуйста, помогите – Brett

+0

@ Вы можете поделиться своим кодом? – DMH

Смежные вопросы