I am having problems with the LinkedIn API, sometimes it's working fine and sometimes I just get the following error:
Message:
file_get_contents(https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code&client_id=####&client_secret=####&code=AQTJH8Hm9K8gmriHaDPLbJm_-E8OnbsiUCZvz32Jv_wD6idTW7Se8v0dohVUH0m8zGWzfKkanCC_NT3smdkoykE0nF88nH-tntK35UqHH4LwgzfcNBc&redirect_uri=http%3A%2F%2Fpeerbriefmini.local%2Flinkedincontroller)
[function.file-get-contents]: failed to open stream: HTTP request
failed! HTTP/1.0 400 request#no_content_length
I have taken out my app id and secret. Is there are reason why it would sometimes work?
Edit : added the php code, which works in codeigniter
<?php
class Linkedincontroller extends CI_Controller {
public function __construct() {
parent::__construct();
$this->config->load('linkedin');
$this->load->library('linkedin');
$this->load->model('account_model');
}
public function index() {
// Change these
define('API_KEY', '###');
define('API_SECRET', '##');
define('REDIRECT_URI', base_url().'linkedincontroller');
define('SCOPE', 'r_fullprofile r_emailaddress rw_nus r_basicprofile r_contactinfo');
// You'll probably use a database
session_name('dfsfsdfsdf');
session_start();
// 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 ($_SESSION['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($_SESSION['expires_at'])) || (time() > $_SESSION['expires_at'])) {
// Token has expired, clear the state
$_SESSION = array();
}
if (empty($_SESSION['access_token'])) {
// Start authorization process
$this->getAuthorizationCode();
}
}
// Congratulations! You have a valid token. Now fetch your profile
$user = $this->fetch('GET', '/v1/people/~:(id,first-name,last-name,main-address,picture-url,public-profile-url,email-address,interests,skills,languages,certifications,educations,positions,courses)');
$linkedin_id = $user['id'];
if(isset($linkedin_id)) {
//var_dump($user);
$linkedin_id = $user['id'];
$linkedin_url = $user['publicProfileUrl'];
$first_name = $user['firstName'];
$last_name = $user['lastName'];
$email = $user['emailAddress'];
$profile_picture = $user['pictureUrl'];
$address = $user['mainAddress'];
$this->account_model->insert_database('accounts',
array(
'account_confirmed' => 1,
'account_active' => 1,
'account_level' => 'Parent',
'account_role' => 'User',
'account_type' => 'Referrer',
'account_completed_level' => 1,
'master_account' => 1,
'account_holder' => $first_name . ' ' .$last_name,
'email' => $email,
'linkedin_id' => $linkedin_id
)
);
$account_id = $this->db->insert_id();
$this->account_model->insert_database('profiles',
array(
'account_id' => $account_id,
'profile_picture' => $profile_picture,
'linkedin_url' => $linkedin_url,
'address' => $address
)
);
// set flash data
$this->session->set_userdata(
array('linkedin_id' => $linkedin_id,
'first_name' => $first_name,
'last_name' => $last_name,
'email' => $email,
'profile_picture' => $profile_picture,
'residential_address' => $address)
);
// redirect back to reg page with profile data
redirect('register');
}else{
$data['header_text'] = $this->account_model->header_text();
$data['header_links'] = $this->account_model->header_links();
$data['user_picture'] = '';
$data['nickname'] = $this->account_model->user_nickname();
$this->load->view('template/header', $data);
$data['error_message'] = 'Unknown LinkedIn credentials.';
$this->load->view('error', $data);
$this->load->view('template/footer');
}
}
// empty fields
private function empty_fields($value) {
if(isset($value)) {
return $value;
}else{
return NULL;
}
}
// authorization code
private 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");
}
// get access token
private 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;
}
// fetch
private 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, true);
//return json_decode($response, false);
}
}
?>
Related
I really appreciate it if someone can help me here. Is there a way I can call the endpoint that generates the api jwt token within my container, anytime the last one expires? below is auth part of my container
App::class => function (ContainerInterface $container) {
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->add(new Tuupola\Middleware\JwtAuthentication([
"secret" => $_ENV['JWT_SECRET'],
"ignore" => ["/api/token","/users"], //s
"error" => function ($response, $arguments) {
$data["status"] = "error";
$data["message"] = $arguments["message"];
//$app->post('/api/token', \App\Action\ApiAuthAction::class)->setName('user-api');
return $response
->withHeader("Content-Type", "application/json")
->getBody()->write((string)json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}
]));
return $app;
},
This is my auth file
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args = []): ResponseInterface
{
$userData = $this->userReader->findUserByEmail($request->getParsedBody());
if ($userData) {
$now = new DateTime();
$future = new DateTime($_ENV['JWT_EXPAIRED'] . " minutes");
$jti = (new Base62)->encode(random_bytes(16));
$payload = [
"iat" => $now->getTimeStamp(),
"exp" => $future->getTimeStamp(),
"jti" => $jti,
"sub" => $userData->email
];
$secret = $_ENV['JWT_SECRET'];
$token = JWT::encode($payload, $secret, "HS256");
$data["token"] = $token;
$data["expires"] = $future->getTimeStamp();
$response->getBody()->write((string)json_encode([
'success' => true,
'message' => $token
]));
} else {
$response->getBody()->write((string)json_encode([
'success' => false,
'message' => 'Invalid Email or Password'
]));
}
return $response->withHeader('Content-Type', 'application/json')->withStatus(200);
}
I have Generated Access token using this script
Here's code
$OAuth = array(
'oauth_uri' => 'https://accounts.google.com/o/oauth2/auth',
'client_id' => '',
'client_secret' => '',
'access_type' => 'online',
'redirect_uri' => '', uri()
'oauth_token_uri' => 'https://accounts.google.com/o/oauth2/token'
);
$token = array(
'access_token' => '',
'token_type' => '',
'expires_in' => '',
'refresh_token' => ''
);
$title = 'No Code';
$AuthCode = 'Null';
$error = _get_url_param($_SERVER['REQUEST_URI'], 'error');
if ($error != NULL)
{ $title = $error;
}
else
{
$AuthCode = _get_url_param($_SERVER['REQUEST_URI'], 'code');
if ($AuthCode == NULL)
{
$OAuth_request = _formatOAuthReq($OAuth, "https://www.googleapis.com/auth/indexing");
header('Location: ' . $OAuth_request);
exit;
}
else
{
$title = 'Got Authorization Code';
$token_response = _get_auth_token($OAuth, $AuthCode);
$json_obj = json_decode($token_response);
$token['access_token'] = $json_obj->access_token;
$token['token_type'] = $json_obj->token_type;
$token['expires_in'] = $json_obj->expires_in;
$token['refresh_token'] = $json_obj->refresh_token;
echo 'access_token = ' . $json_obj->access_token;
}
}
function _get_auth_token($params, $code)
{
$url = $params['oauth_token_uri'];
$fields = array(
'code' => $code,
'client_id' => $params['client_id'],
'client_secret' => $params['client_secret'],
'redirect_uri' => $params['redirect_uri'],
'grant_type' => 'authorization_code'
);
$response = _do_post($url, $fields);
return $response;
}
function _formatOAuthReq($OAuthParams, $scope)
{
$uri = $OAuthParams['oauth_uri'];
$uri .= "?client_id=" . $OAuthParams['client_id'];
$uri .= "&redirect_uri=" . $OAuthParams['redirect_uri'];
$uri .= "&scope=" . $scope;
$uri .= "&response_type=code";
$uri .= "&access_type=offline";
return $uri;
}
When I run the script in Chrome Browser it works.
But when I set a cronjob but it's not working, and no token is generated
How to generate google access token using cronjob?
I hope you people understand it and can help me :).
Hear is my php code that trying to login by Facebook
public function fb_login(){
$fb = new Facebook\Facebook([
'app_id' => '<app id>',
'app_secret' => '<app secret>',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['public_profile', 'user_friends', 'publish_actions', 'email', 'user_about_me', 'user_birthday']; // optional
$data['login_url'] = $helper->getLoginUrl('http://localhost/trada-backend/index.php/facebook_login/fb_callback', $permissions);
// $data = json_encode($data['login_url']);
/*$this->load->view('home',$data);*/
echo json_encode($data);
// echo $data;
}
public function fb_callback(){
$fb = new Facebook\Facebook([
'app_id' => '<app id>',
'app_secret' => '<app secret>',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (isset($accessToken)) {
// Logged in!
$_SESSION['facebook_access_token'] = (string) $accessToken;
$session = $_SESSION['facebook_access_token'];
$fbApp = new Facebook\FacebookApp('<app id>', '<app secret>');
$request = new Facebook\FacebookRequest($fbApp, $accessToken, 'GET', '/me',
array('fields' => 'picture{url},id,name,birthday,email,link'));
try {
$response = $fb->getClient()->sendRequest($request);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$graphNode = $response->getGraphNode();
/* handle the result */
// $message = 'User name: ' . $graphNode['name'];
$data = array (
'id' => $graphNode['id'],
'birthday' => $graphNode['birthday'],
'email' => $graphNode['email'],
'link' => $graphNode['link'],
'user_name' => $graphNode['name'],
'is_logged_in' => 1,
'profile_pic_link' => json_decode($graphNode['picture'])->url
);
$this->session->set_userdata($data);
/*redirect(base_url().'user/index');*/
echo json_encode($data);
// Now you can redirect to another page and use the
// access token from $_SESSION['facebook_access_token']
}
}
Here is my Ajax
$.ajax({
type: "POST",
url: "http://localhost/trada-backend/index.php/Facebook_login/fb_login",
success : function(url_response){
var url = JSON.parse(url_response);
/*alert(url.login_url);*/
$('a.btn-facebook').attr('href', url.login_url);
}
});
In my Ajax, I try to get the url from fb_login() in php in order to get the permission from user but after that I want to request this which inside fb_callback()
$data = array (
'id' => $graphNode['id'],
'birthday' => $graphNode['birthday'],
'email' => $graphNode['email'],
'link' => $graphNode['link'],
'user_name' => $graphNode['name'],
'is_logged_in' => 1,
'profile_pic_link' => json_decode($graphNode['picture'])->url
);
However, the fb_callback() is called inside my fb_login()
$data['login_url'] = $helper->getLoginUrl('http://localhost/trada-backend/index.php/facebook_login/fb_callback', $permissions);
So, how can I retrieve my desired data ? Thanks in advance
SOLVED
So I have figured out 1 way to deal with this.
First I put my desired data at fb_callback() to a cookie and then send this cookie to my frontend page
$data = json_encode($data_session);
setcookie('facebook', $data, time()+1, "/");
include('http://localhost/trada-frontend/index.html');
redirect('http://localhost/trada-frontend/index.html');
In my js file I get the data from the cookie by seperating cookie name and its data and decode uri the data
var fb_data= document.cookie;
if(fb_data != null){
var cookieParts = fb_data.match(/^([^=]+)=(.*)$/);
var cookie_name = cookieParts[1];
var decode = decodeURIComponent(cookieParts[2]);
var fb = JSON.parse(decode);
}
Here is the code:
$client_id = '';
$client_secret = '';
$callback_url = '';
$buffer = new BufferApp($client_id, $client_secret, $callback_url);
if (!$buffer->ok) {
echo 'Connect to Buffer!';
} else {
//this pulls all of the logged in user's profiles
$profiles = $buffer->go('/profiles');
if (is_array($profiles)) {
foreach ($profiles as $profile) {
//this creates a status on each one
$buffer->go('/updates/create', array('text' => 'My first status update from bufferapp-php worked!', 'profile_ids[]' => $profile->id));
}
}
}
if (isset($_GET['code']))
{
var_dump($_SESSION['oauth']['buffer']['access_token']);
}
it is an example code, I had to be returned the access_token, but it is NULL
trying to log in I'm redirected to the bufferapp' site, give the access, then I'm redirected back and it is NULL
what's the problem ?
thanks in advance)
the bufferapi code :
class BufferApp {
private $client_id;
private $client_secret;
private $code;
private $access_token;
private $callback_url;
private $authorize_url = 'https://bufferapp.com/oauth2/authorize';
private $access_token_url = 'https://api.bufferapp.com/1/oauth2/token.json';
private $buffer_url = 'https://api.bufferapp.com/1';
public $ok = false;
private $endpoints = array(
'/user' => 'get',
'/profiles' => 'get',
'/profiles/:id/schedules/update' => 'post', // Array schedules [0][days][]=mon, [0][times][]=12:00
'/profiles/:id/updates/reorder' => 'post', // Array order, int offset, bool utc
'/profiles/:id/updates/pending' => 'get',
'/profiles/:id/updates/sent' => 'get',
'/profiles/:id/schedules' => 'get',
'/profiles/:id' => 'get',
'/updates/:id/update' => 'post', // String text, Bool now, Array media ['link'], ['description'], ['picture'], Bool utc
'/updates/create' => 'post', // String text, Array profile_ids, Aool shorten, Bool now, Array media ['link'], ['description'], ['picture']
'/updates/:id/destroy' => 'post',
'/updates/:id' => 'get',
'/links/shares' => 'get',
);
public $errors = array(
'invalid-endpoint' => 'The endpoint you supplied does not appear to be valid.',
'403' => 'Permission denied.',
'404' => 'Endpoint not found.',
'405' => 'Method not allowed.',
'1000' => 'An unknown error occurred.',
'1001' => 'Access token required.',
'1002' => 'Not within application scope.',
'1003' => 'Parameter not recognized.',
'1004' => 'Required parameter missing.',
'1005' => 'Unsupported response format.',
'1010' => 'Profile could not be found.',
'1011' => 'No authorization to access profile.',
'1012' => 'Profile did not save successfully.',
'1013' => 'Profile schedule limit reached.',
'1014' => 'Profile limit for user has been reached.',
'1020' => 'Update could not be found.',
'1021' => 'No authorization to access update.',
'1022' => 'Update did not save successfully.',
'1023' => 'Update limit for profile has been reached.',
'1024' => 'Update limit for team profile has been reached.',
'1028' => 'Update soft limit for profile reached.',
'1030' => 'Media filetype not supported.',
'1031' => 'Media filesize out of acceptable range.',
);
public $responses = array(
'403' => 'Permission denied.',
'404' => 'Endpoint not found.',
'405' => 'Method not allowed.',
'500' => 'An unknown error occurred.',
'403' => 'Access token required.',
'403' => 'Not within application scope.',
'400' => 'Parameter not recognized.',
'400' => 'Required parameter missing.',
'406' => 'Unsupported response format.',
'404' => 'Profile could not be found.',
'403' => 'No authorization to access profile.',
'400' => 'Profile did not save successfully.',
'403' => 'Profile schedule limit reached.',
'403' => 'Profile limit for user has been reached.',
'404' => 'Update could not be found.',
'403' => 'No authorization to access update.',
'400' => 'Update did not save successfully.',
'403' => 'Update limit for profile has been reached.',
'403' => 'Update limit for team profile has been reached.',
'403' => 'Update soft limit for profile reached.',
'400' => 'Media filetype not supported.',
'400' => 'Media filesize out of acceptable range.',
);
function __construct($client_id = '', $client_secret = '', $callback_url = '') {
if ($client_id) $this->set_client_id($client_id);
if ($client_secret) $this->set_client_secret($client_secret);
if ($callback_url) $this->set_callback_url($callback_url);
if ($_GET['code']) {
$this->code = $_GET['code'];
$this->create_access_token_url();
}
$this->retrieve_access_token();
}
function go($endpoint = '', $data = '') {
if (in_array($endpoint, array_keys($this->endpoints))) {
$done_endpoint = $endpoint;
} else {
$ok = false;
foreach (array_keys($this->endpoints) as $done_endpoint) {
if (preg_match('/' . preg_replace('/(\:\w+)/i', '(\w+)', str_replace('/', '\/', $done_endpoint)) . '/i', $endpoint, $match)) {
$ok = true;
break;
}
}
if (!$ok) return $this->error('invalid-endpoint');
}
if (!$data || !is_array($data)) $data = array();
$data['access_token'] = $this->access_token;
$method = $this->endpoints[$done_endpoint]; //get() or post()
return $this->$method($this->buffer_url . $endpoint . '.json', $data);
}
function store_access_token() {
$_SESSION['oauth']['buffer']['access_token'] = $this->access_token;
}
function retrieve_access_token() {
$this->access_token = $_SESSION['oauth']['buffer']['access_token'];
if ($this->access_token) {
$this->ok = true;
}
}
function error($error) {
return (object) array('error' => $this->errors[$error]);
}
function create_access_token_url() {
$data = array(
'code' => $this->code,
'grant_type' => 'authorization_code',
'client_id' => $this->client_id,
'client_secret' => $this->client_secret,
'redirect_uri' => $this->callback_url,
);
$obj = $this->post($this->access_token_url, $data);
$this->access_token = $obj->access_token;
$this->store_access_token();
}
function req($url = '', $data = '', $post = true) {
if (!$url) return false;
if (!$data || !is_array($data)) $data = array();
$options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false);
if ($post) {
$options += array(
CURLOPT_POST => $post,
CURLOPT_POSTFIELDS => $data
);
} else {
$url .= '?' . http_build_query($data);
}
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$rs = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($code >= 400) {
return $this->error($code);
}
return json_decode($rs);
}
function get($url = '', $data = '') {
return $this->req($url, $data, false);
}
function post($url = '', $data = '') {
return $this->req($url, $data, true);
}
function get_login_url() {
return $this->authorize_url . '?'
. 'client_id=' . $this->client_id
. '&redirect_uri=' . urlencode($this->callback_url)
. '&response_type=code';
}
function set_client_id($client_id) {
$this->client_id = $client_id;
}
function set_client_secret($client_secret) {
$this->client_secret = $client_secret;
}
function set_callback_url($callback_url) {
$this->callback_url = $callback_url;
}
}
I am new to codeigniter and paypal. I am working on gocart(an open source eCommerce solution built on codeIgniter). I try to work on paypal API integrated in it, but its showing error as follows :
[ACK] => Failure [L_ERRORCODE0] => 81002 [L_SHORTMESSAGE0] => Unspecified Method [L_LONGMESSAGE0] => Method Specified is not Supported [L_SEVERITYCODE0] => Error
Below is my code : paypal_expres.php
$this->RETURN_URL = 'www.example.com';
$this->CANCEL_URL = 'www.example.com';
$this->currency = 'USD';
$this->host = "api-3t.sandbox.paypal.com";
$this->gate = 'https://www.sandbox.paypal.com/cgi-bin/webscr?';
public function doExpressCheckout($amount, $desc, $invoice='') {
$data = array(
'PAYMENTACTION' =>'Sale',
'AMT' => '24',
'RETURNURL' => $this->getReturnTo(),
'CANCELURL' => $this->getReturnToCancel(),
'CURRENCYCODE'=> $this->currency,
'METHOD' => 'SetExpressCheckout'
);
$query = $this->buildQuery($data);
$result = $this->response($query);
$response = $result->getContent();
$return = $this->responseParse($response);
echo '';
print_r($return);
echo '';
if ($return['ACK'] == 'Success') {
header('Location: '.$this->gate.'cmd=_express-checkout&useraction=commit&token='.$return['TOKEN'].'');
}
return($return);
}
public function doExpressCheckout($amount, $desc, $invoice='') {
$data = array(
'PAYMENTACTION' =>'Sale',
'AMT' => '24',
'RETURNURL' => $this->getReturnTo(),
'CANCELURL' => $this->getReturnToCancel(),
'CURRENCYCODE'=> $this->currency,
'METHOD' => 'SetExpressCheckout'
);
$query = $this->buildQuery($data);
$result = $this->response($query);
$response = $result->getContent();
$return = $this->responseParse($response);
echo '';
print_r($return);
echo '';
if ($return['ACK'] == 'Success') {
header('Location: '.$this->gate.'cmd=_express-checkout&useraction=commit&token='.$return['TOKEN'].'');
die();
}
return($return);
}
private function response($data) {
$result = $this->CI->httprequest->connect($data);
if ($result<400) return $this->CI->httprequest;
return false;
}
private function buildQuery($data = array()) {
$data['USER'] = $this->API_USERNAME;
$data['PWD'] = $this->API_PASSWORD;
$data['SIGNATURE'] = $this->API_SIGNATURE;
$data['VERSION'] = '56.0';
$query = http_build_query($data);
return $query;
}
When Paypal returns this message it's a case of transmit method, not the method argument/property.
As in Paypal only accepts POST.