How to return access token facebook? - javascript

I don't know how to sync in api FB.login and here is my code:
function getAccesToken(){
var access_token = "";
FB.login(function(response) {
if (response.authResponse) {
access_token = FB.getAuthResponse()['accessToken'];
} else {
console.log('User cancelled login or did not fully authorize.');
}
}, { scope: '' });
return access_token;
}
when I call function
var access_token = getAccessToken();
but it return empty string. How can I fix it to be synchronous?

You can't make this synchronous - and it would be extremely bad practice if you could. Instead, call a function in the FB.login callback handler that contains the access token. Try this:
function getAccesToken() {
FB.login(function(response) {
if (response.authResponse) {
loginComplete(FB.getAuthResponse()['accessToken']);
} else {
console.log('User cancelled login or did not fully authorize.');
}
}, { scope: '' });
}
function loginComplete(token) {
console.log(token);
// do something here, now the user is logged in...
}

FB.login needs to be called on user interaction (mouse click) and you have to use the callback function of FB.login to get the Access Token asynchronously - the Access Token will be in the response value. For example:
document.getElementById('loginBtn').addEventListener('click', function() {
FB.login(function(response) {
if (response.authResponse) {
doSomethingWithTheToken(response.authResponse.accessToken);
}
}, {scope: 'email,public_profile', return_scopes: true});
}, false);
function doSomethingWithTheToken(token) {
console.log(token);
}
Source (and a lot more information about the JavaScript SDK): http://www.devils-heaven.com/facebook-javascript-sdk-login/

Related

FaceBook JavaScript SDK no response is sent when login cancelled

I am working with the FaceBook JavaScript SDK to log users in via FaceBook SSO. documentation
Clicking the SSO button opens a new window prompting the user to log in via FaceBook. If the user logs in there is no issue. However, if the user exits or cancels the SSO, I am not getting a response from FB.
Here is the function given in the FB documentation:
FB.login(function(response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
});
I have tried using this function exactly and again if I cancel the SSO the else block never runs as I would expect it to.
I am trying to modify the function slightly but I still am not able to get a response when the page is cancelled.
static login(callbacks, { mode = "login" }) {
const FB = window.FB;
FB.login(
(res) => {
console.log(res);
const { authResponse } = res;
if (mode === "login") {
Facebook.socialSignOn(authResponse, callbacks);
} else if (mode === "verify") {
Facebook.socialVerify(authResponse, callbacks);
}
},
{ return_scopes: "true", scope: "email" }
);
}
UPDATE
After playing around more it seems like if I try to use the FB SSO, cancel, and then try again all future FB.login() attempts immediately receive a response with authResponse : null

Facebook Js Sdk, publish_actions not working

i'm using javascript sdk and i have already send to review my publish_action , they are approved. Anyway i can't publish my post , the way i require the scope is this:
FB.login(function(response)
{
...
}, {scope: 'email,publish_actions'});
When i try to publish the return error is:
(#200) The user hasn't authorized the application to perform this action
It's true, because in the facebook modal login, appears only the permission to read information of the profile, no the permission to publish. How i can solve?
EDIT
i add my complete code to better explain:
<script type="text/javascript">
/***FACEBOOK***/
function fb_publish_Photo(immaginelink,idfoto){
var testo_share= $("#share_text").text();
var wallPost = {
message: testo_share,
link:immaginelink,
picture:immaginelink
};
console.log(wallPost);
FB.api('/me/feed', 'post', wallPost , function(response) {
if (!response || response.error) {
console.log(response.error);
alert('Failure! ' + response.error + ' You may logout once and try again');
} else {
// alert('Success! Post ID: ' + response.id);
var PostId=response.id;
if(response.id!=null && response.id!=''){
FB.getLoginStatus(function (response) {
if (response.authResponse) {
} else {
// do something...maybe show a login prompt
}
}, {scope: 'publish_actions'});
}
}
console.log(response);
}, { scope: 'publish_actions'});
}
function statusChangeCallback(response) {
console.log('statusChangeCallback');
console.log(response);
// The response object is returned with a status field that lets the
// app know the current login status of the person.
// Full docs on the response object can be found in the documentation
// for FB.getLoginStatus().
if (response.status === 'connected') {
// Logged into your app and Facebook.
//fb_login();
} else if (response.status === 'not_authorized') {
} else {
}
}
function fb_login(){
FB.login(function(response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
//console.log(response); // dump complete info
access_token = response.authResponse.accessToken; //get access token
user_id = response.authResponse.userID; //get FB UID
FB.api('/me?fields=email,first_name,last_name,name', function(response) {
//chiamata ajax per registrare/loggare l'utente
console.log(response);
});
} else {
//user hit cancel button
console.log('User cancelled login or did not fully authorize.');
}
}, {
scope: 'publish_actions'
});
}
// This function is called when someone finishes with the Login
// Button. See the onlogin handler attached to it in the sample
// code below.
function checkLoginState() {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
});
}
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxx',
cookie : true, // enable cookies to allow the server to access
// the session
xfbml : true, // parse social plugins on this page
version : 'v2.4' // use version 2.4
});
// Now that we've initialized the JavaScript SDK, we call
// FB.getLoginStatus(). This function gets the state of the
// person visiting this page and can return one of three states to
// the callback you provide. They can be:
//
// 1. Logged into your app ('connected')
// 2. Logged into Facebook, but not your app ('not_authorized')
// 3. Not logged into Facebook and can't tell if they are logged into
// your app or not.
//
// These three cases are handled in the callback function.
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
});
};
// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
/***end FB***/
</script>
EDIT
This is the only ref i can find in facebook documentation:
function myFacebookLogin() {
FB.login(function(){}, {scope: 'publish_actions'});
}
or
FB.login(function(){
// Note: The call will only work if you accept the permission request
FB.api('/me/feed', 'post', {message: 'Hello, world!'});
}, {scope: 'publish_actions'});
It seems simple, in login call i have to require permission, so why the publish permission dialog not appears in an approved app?
EDIT
this is a screen of my app permission
Publish_actions scope now seems to works correctly. I had two times scope request.

Logout in Facebook SDK Javascript

In my app I can log in to Facebook but I can't logout. When I click button which call logout function I get:
Object { authResponse: null, status: "unknown" }
Here is my code:
function login_to_fb() {
FB.login(function(response) {
if (response.status === 'connected') {
window.location.reload();
}
}, {
scope: 'email'
});
}
function logout_from_fb() {
FB.getLoginStatus(function(response) {
console.log(response);
if (response && response.status === 'connected') {
FB.logout(function(response) {
window.location.reload();
});
}
});
}
I figured out it's because I refresh the page. Without it, scripts works fine but when I log-in and refresh the page then log-out is impossible. How can I save it?
It is possible that the result is cached. Try passing true as the second argument to clear the cache:
FB.getLoginStatus(function(response) {
// this will be called when the roundtrip to Facebook has completed
}, true);

Javascript asynchronous

I have some 3 methods.
login();
isLogin();
reply();
function isLogin(){
FB.getLoginStatus(function(response) {
if (response.session) {
// logged in and connected user, someone you know
} else {
// no user session available, someone you dont know
}
});
}
function login (){
FB.login(function(response) {
if (response.session) {
// user successfully logged in
} else {
// user cancelled login
}
});
}
function reply(){
var body = 'Reading Connect JS documentation';
FB.api('/me/feed', 'post', { body: body }, function(response) {
if (!response || response.error) {
alert('Error occured');
} else {
alert('Post ID: ' + response);
}
});
}
I need, when a user will want to reply a comment then reply method will execute. before executing reply method it should test if user is login, if user is not login then execute login method and call reply method again. How can I achieve this task
Thanks in advance
you need to construct conditions that will handle the following:
When a user will want to reply a comment
Check session if user isLogin()
if TRUE then reply method is enabled by default
if FALSE then call login() method via ajax for awesomeness
if login.success then call reply method
if login.failed add statement here

facebook connect: check if user has permissions with javascript

i am creating login code for facebook connect on our site,
however i cannot find how to check if the user has the required permissions.
with the old javascript, one dialog would be opened for each permission and the return code would say if the permission was accepted or not, how does it work with the javascript code?
here is the code i got so far, with the TODO where i want to check if the user has got permissions
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: 'MY API KEY', status: true, cookie: true,xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
alert("logged in");
//TODO: check if all perms has been accepted!!!!
//if they have NOT been accepted, I want to logout the user
});
FB.getLoginStatus(function(response) {
if (response.session) {
// logged in and connected user, again, check if all perms has been accepted
alert("already logged in");
}
});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
<fb:login-button perms="email,user_birthday,status_update,publish_stream" >Login with Facebook</fb:login-button>
btw, in the documentation they have this example
http://developers.facebook.com/docs/reference/javascript/FB.login
where they use custom buttons, that's why i suspected that there would be something similar for the fb:loginbutton
FB.Event.subscribe('auth.login',function(response) {
if(response.session) { //checks if session is true
alert('logged in');
if(response.perms) { //checks if perms is true = permissions are granted
alert('perms granted');
}
else { //if perms is false = no permissions granted
alert('no perms');
}
}
else { //if something goes wrong
alert('login failure');
}
});
Original Facebook guide:
http://developers.facebook.com/docs/reference/javascript/FB.login
I made this solution to check for "user_friends" and "publish_actions" permissions, if not allowed the both, force the user to "re-autenticate". The callback function will only be called when all permissions are given.
function login(cb,forceAuth) {
FB.getLoginStatus(function (response) {
if (response.status !== 'connected' || forceAuth==true){
FB.login(function (response) {
checkPermissions(cb,false);
}, {scope: 'publish_actions,user_friends'});
} else {
checkPermissions(cb);
}
});
}
function checkPermissions(cb,forceAuth){
FB.api(
"/me/permissions",
function (response) {
if (response.data[0]['publish_actions']==undefined || response.data[0]['publish_actions']==0 ||
response.data[0]['user_friends']==undefined || response.data[0]['user_friends']==0) {
if (forceAuth!=false)
login(cb,true);
} else {
cb();
}
}
);
}
How to use:
login(function () {
myLogedAndAllowedFunction();
});

Categories