Facebook PHP SDK getUser适用于Facebook上的canvas应用程序,但在移动网站中它不起作用

时间:2012-12-16 21:47:15

标签: php facebook authentication

我制作了一款完美运行的Facebook应用,所以现在我正在尝试设置一款移动应用。我在文档中描述了使用此代码来检查用户是否已登录,如果用户已登录,则向前传递信息。这是我正在使用的代码:

<?php 
session_start();

// Include facebook PHP SDK
 require_once("lib/facebook.php");


// Configure the facebook object
$config = array();
$config['appId'] = 'APP_ID';
$config['secret'] = 'APP_SECRET';
$config['cookie'] = true;
$config['fileUpload'] = true;

$app_id = 'APP_ID';
$canvas_page = "https://hadadmin.yourwebhosting.com/mixit/mobile/";

     $location = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&scope=publish_stream,email,create_event,rsvp_event,user_events,friends_events";

    // initialize the facebook oject
  $facebook = new Facebook($config);

    // Get Facebook User
    $fbID = $facebook->getUser();

    // Get the current access token
    $access_token = $facebook->getAccessToken();

    // check if we have valid user
if ($fbID) {
    try {
        // Proceed knowing you have a logged in user who's authenticated.
        $fb_user_profile = $facebook->api('/me');   

    } catch (FacebookApiException $e) {
        $fbID = NULL;
        // seems we don't have enough permissions
        // we use javascript to redirect user instead of header() due to Facebook bug
        print '<script language="javascript" type="text/javascript"> top.location.href="'. $location .'"; </script>';

        // kill the code so nothing else will happen before user gives us permissions
        die();
    } 

} else {
    // seems our user hasn't logged in, redirect him to a FB login page

print '<script language="javascript" type="text/javascript"> top.location.href="'. $location .'"; </script>';

  // kill the code so nothing else will happen before user gives us permissions
   die();
}

我已经搜索了所有类似问题的解决方案都没有工作(即getUser返回0)getUser像其他帖子一样返回0,但就像我说的那样,当我不使用移动设备时它工作正常网站,apps.facebook.com/MYAPP和https://hadadmin.yourwebhosting.com/mixit/也在运作。很抱歉写了这么多我只是想确保我提供所有信息。任何帮助都感激不尽。提前谢谢,罗伯特

1 个答案:

答案 0 :(得分:2)

getUser使用javascript SDK或signed_request设置Cookie(适用于画布和页面标签)。

当您在移动网站上时,如果它是第一个用户连接,您将没有cookie,并且显然没有signed_request。因此,您需要使用status方法中的设置trueinit使用javascript SDK设置Facebook连接,或致电getLoginStatus。然后,您可以请求您的服务器(cookie将与同一域上的任何ajax请求一起发送。)

编辑后

从我看到的,你在这里遇到跨域通信的麻烦。请务必使用有效的channel文件正确设置Facebook。对于IE,设置P3P标头,这将有很大帮助。对于Safari来说,这是一个很糟糕的工作,但谷歌“跨域通信”,你会发现很多解决方案。但如果正确设置Facebook SDK,则不需要这些。

希望这有帮助!