LinkedIn PHP API不设置访问令牌codeigniter [英] Linkedin php api not setting access token in codeigniter

查看:281
本文介绍了LinkedIn PHP API不设置访问令牌codeigniter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这与LinkedIn的API的工作我的第一次,我试图按照官方文档在这个例子:

This is my first time working with the linkedIn api and I am trying to follow this example in the official documentation:

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

我已经重构了同样的程序code到名为验证 A codeigniter控制器类:

I have refactored that same procedural code into a codeigniter controller class called 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 。但我什么也没得到。当前会话的输出是:

I am using the database to store sessions and I was expecting access_token to be one of the values stored in my serialized field called user_data. But I get nothing. The output of the current session is:

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的,我不能够正确要么调试这个code。到目前为止,什么工作是:

I don't understand why linkedin is not giving me back tokens for storage. Because of the redirect_url, I am not able to debug this code properly either. So far what is working is:


  1. 用户被重定向到这个UR授权窗口:<一href=\"https://www.linkedin.com/uas/oauth2/authorization?response_type=$c$c&client_id=75y11f289134ga&scope=r_basicprofile+r_emailaddress+rw_groups&state=52a72cc4e54f36.03304050&redirect_uri=\" rel=\"nofollow\">https://www.linkedin.com/uas/oauth2/authorization?response_type=$c$c&client_id=75y11f289134ga&scope=r_basicprofile+r_emailaddress+rw_groups&state=52a72cc4e54f36.03304050&redirect_uri=<$c$c>http%3A%2F%2F127.0.0.1%3A8000%2Fauth

用户被重定向到没有与这个网址的任何错误 AUTH 的行动: <$c$c>http://127.0.0.1:8000/auth?$c$c=AQTWPFJqnZlBZmFByb3Vbjkf4jtNvn8C7atg5iM6iXFW3ON_SrM3uJ9h8AiF1RbMjgGt_NpDq4cTPL1qw8uNiA_vsOv1H3lpxu0IxHVx_sa9rDAinbo&state=52a72d109261d4.41607693

User is being redirected to the auth action without any error with this url: http://127.0.0.1:8000/auth?code=AQTWPFJqnZlBZmFByb3Vbjkf4jtNvn8C7atg5iM6iXFW3ON_SrM3uJ9h8AiF1RbMjgGt_NpDq4cTPL1qw8uNiA_vsOv1H3lpxu0IxHVx_sa9rDAinbo&state=52a72d109261d4.41607693

但哪里是我的个人资料数据?如何以及在哪里可以进行API调用来检索文件数据?请帮助

But where is my profile data? How and where do I make an api call to retrieve profile data? Please help

推荐答案

我在codeigniter一样的。

I do the same in the Codeigniter.

下面是过程,以获得验证用户配置文件。

Here is procedure to get Auth User Profile.


  1. 创建LinkedIn库

  1. Create a library for 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 */


  • 把你所有的常量东西在confin / constants.php

  • Put all your Constants stuff in confin/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');
    


  • 现在控制器

  • Now the Controller

    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
            }
        }
    
    }
    


  • 这篇关于LinkedIn PHP API不设置访问令牌codeigniter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆