LinkedIn PHP API不设置访问令牌codeigniter [英] Linkedin php api not setting access token in 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 存储在我的序列化领域中的一个值code>。但我什么也没得到。当前会话的输出是:
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:
-
用户被重定向到这个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$c$c>
用户被重定向到没有与这个网址的任何错误 AUTH
的行动: <$c$c>http://127.0.0.1:8000/auth?$c$c>$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.
-
创建LinkedIn库
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屋!