Request user data after logging in by facebook - php

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

Related

Aws Cognito php client getUser allways is null

i'm trying to validate an access token isued by aws cognito on backend but i'm stucked at this, i have this:
<?php
namespace App\Bridge;
class AwsCognitoClient
{
private $client;
public function __construct(
string $key,
string $secret,
string $poolId,
string $clientId,
string $clientSecret,
string $region,
string $version
) {
$this->region = $region;
$this->poolId = $poolId;
$config = [
'credentials' => [
'key' => $key,
'secret' => $secret,
],
'region' => $region,
'version' => $version,
'app_client_id' => $clientId,
'app_client_secret' => $clientSecret,
'user_pool_id' => $poolId,
];
$aws = new \Aws\Sdk($config);
$this->client = $aws->createCognitoIdentityProvider();
}
public function verifyToken($access_token)
{
try {
$user = $this->client->getUser([
'AccessToken' => $access_token
]);
error_log("USER NULL ALWAYS: " . json_encode($user));
} catch (\Exception $e) {
error_log("ERROR COGNITO: " . $e->getMessage());
}
}
}
but $this->client->getUser always be empty and if token is expired throw correct exception for expired, but if token is valid not show nothing only $user be empty;
what is wrong?

give user media in instagram in laravel 5.4

I'm Trying use Access_token to give user media.
I give Code and Access_token This Way:
My Controller and view has this Code:
public function indexx(Request $request)
{
$code = $this->code = $request->get('code');
try {
$client = new Client();
$res = $client->request('POST', 'https://api.instagram.com/oauth/access_token', [
'form_params' => [
'client_id' => ''client_id',
'client_secret' => 'client_secret' ,
'grant_type' => 'authorization_code',
'redirect_uri'=> 'http://asemi.ir/laravel/public/instagram/s, 'code' => $code
]
]);
$status = $res->getStatusCode();
if ($status == 200) {
$body = $res->getBody();
$obj = \GuzzleHttp\json_decode($body);
//(cookie('access', $access, 45000));
$username = $obj->user->username;
$img = $obj->user->profile_picture;
$full_name = $obj->user->full_name;
$bio = $obj->user->bio;
$website = $obj->user->website;
$access_token=$obj->access_token;
$data = array(
'username' => $username,
'img' => $img,
'full_name' => $full_name,
'bio' => $bio,
'website' => $website,
'access' => $access_token
);
echo view('json')->with($data);
} else {
echo "status is not 200";
}
} catch (BadResponseException $e) {
echo "error1";
}
and view file has this code:
<script>
$(document).ready(function () {
$("button").click(function () {
$.ajax({
method: 'GET',
url: './amir?code={{$code}}',
success: function (data) {
$("#test").html(data);
}
});
});
});
How can I use access_token in controller with json and Guzzle to give user Media ?

Using with modifier with facebook API for users location

I am trying to get a users location from me/feed
Like this
if ($user) {
try {
$user_profile = $facebook->api('/me');
$friends = $facebook->api('/me/friends');
$feeds = $facebook->api('/me/feed',
array (
'with' => 'location',
));
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
When I print this it gives me the whole feed and not just the post with location like the API says it will...
Docs Here
print_r($facebook->api('/me/feed'));
And here is my code all together.
<?php
require 'facebookAPI/src/facebook.php';
$facebook = new Facebook(array(
'appId' => '0000000',
'secret' => '000000000',
));
$user = $facebook->getUser();
if ($user) {
try {
$user_profile = $facebook->api('/me');
$friends = $facebook->api('/me/friends');
$feeds = $facebook->api('/me/feed',
array (
'with' => 'location',
));
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
if ($user) {
$params = array( 'next' => 'http://www.wuno.com/sandbox/actions/fbLogout.php' );
$logoutUrl = $facebook->getLogoutUrl($params);
} else {
$loginUrl = $facebook->getLoginUrl(array(
'scope' => 'user_about_me, user_checkins, friends_checkins, user_location, friends_location, read_stream')
);
}
?>

LinkedIn API Request Failed HTTP 400

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);
}
}
?>

cannot get user_id with get_user()

i am using the facebook php sdk in conjunction with codeigniter. the problem i have now is that i seem to be unable to get the user_id via get_user() it will always return 0. this is my code:
<?php
class Facebook_model extends CI_Model {
public function __construct() {
parent::__construct();
$config = array(
'appId' => '....',
'secret' => '...',
'fileUpload' => true
);
$this->load->library('facebook', $config);
$user = $this->facebook->getUser();
$profile = null;
if ($user) {
try {
$profile = $this->facebook->api('/me?fields=id,name,link,email');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
$fb_data = array(
'me' => $profile,
'uid' => $user,
'loginUrl' => $this->facebook->getLoginUrl(
array(
'scope' => 'email,user_birthday,publish_stream'// URL where you want to redirect your users after a successful login
)
),
'logoutUrl' => $this->facebook->getLogoutUrl()
);
$this->session->set_userdata('fb_data', $fb_data);
}
}
i read somewhere it could be a problem with cookies and codeigniter but i can't figure ou how to solve this issue
configure your facebook configuration file as below
$facebook = new Facebook('keep your facebook config file here');
$my_details = $facebook->api('/me');
now the array $my_details will give you the complete details of your fb application along with the user id

Categories