Skip to main content

facebook iframe app; php sdk getUser() returns valid id on page one but not for any other page



I have a facebook iframe app which correctly logs in and authorizes the app, but getUser() only works on the first page. As soon as a user clicks a link to a new page within the iframe, getUser() returns 0.





What's strange is that this same code works for another app... I do all the clicking I want and getUser() returns a valid ID.





The app that doesn't work: https://apps.facebook.com/celestial_glory/





The one that does (same codebase): https://apps.facebook.com/uprisingstlouis/





Here's the code I am using:







require_once ('fb/facebook.php');



// snip... set $app_id, $secret, and $canvas_page



// first, try normal facebook getUser(). If that works, awesome.



$facebook = new Facebook(array(

'appId' => $app_id,

'secret' => $secret,

));



$signed_request = $_REQUEST['signed_request'];



// Get User ID

$user = $facebook->getUser();

if ($user != '0') return 'fb=' . $user; // works once



// getUser() didn't work. Try oAuth. Maybe user needs to log in or

// authorize the game?



$auth_url = 'http://www.facebook.com/dialog/oauth?client_id='

. $app_id . '&redirect_uri=' . urlencode($canvas_page);



list($encoded_sig, $payload) = explode('.', $signed_request, 2);



$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);



if (empty($data["user_id"])) {

echo '<a target="_top" href="' . $auth_url . '">Login to Facebook</a>';

exit;

// normally we would auto-redirect, but with a uid of 0, this just auto-redirects

// echo("<script> top.location.href='" . $auth_url . "'</script>");

} else {

return 'fb=' . $data['user_id'];

}







any ideas? I have triple-checked app ids and secrets and canvas pages. If those were wrong, I expect no page, not even the first, would work.


Comments

  1. Change Facebook PHP-SDK initialization to:

    $facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $secret,
    'cookie' => true // this!
    ));


    getUser works on the first page because it can get the user from signed_request (POST'ed by Facebook to your canvas page URL). Thus you need some way to track your user once he starts navigation deeper within your application. You could pass signed_request somehow all by yourself or simply enable built-in PHP-SDK cookie support as suggested above.

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.