【问题标题】:Facebook PHP SDK getUser works with canvas app on Facebook but in mobile site it doesn't workFacebook PHP SDK getUser 适用于 Facebook 上的画布应用程序,但在移动站点中它不起作用
【发布时间】:2012-12-04 01:18:06
【问题描述】:

我已经制作了一个完美运行的 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/ 也正在运行。

【问题讨论】:

    标签: php facebook authentication


    【解决方案1】:

    getUser 使用由 javascript SDK 或通过 signed_request(用于画布和页面选项卡)设置的 cookie。

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

    修改后: 据我所知,您在这里的跨域通信有问题。请务必使用有效的channel 文件正确设置 facebook。对于 IE,设置 P3P 标头,这将有很大帮助。对 Safari 来说,这是一项艰巨的工作,但谷歌“跨域通信”,你会找到很多解决方案。但如果 Facebook SDK 设置正确,则不需要这些。

    希望对您有所帮助!

    【讨论】:

    • 这不起作用:(。另外,值得一提的是,移动网站也可以在 google chrome 中运行,但不能在 safari(普通或 ios 4.3)中运行,也不能在 IE9 中运行
    • 好吧,没有更多的细节在你身边,我很难给你更多的信息。阅读这个问题,关于如何正确实现FB认证有很多更详细的解释:stackoverflow.com/questions/13351235/…
    • 关于 Safari 和 IE9,它们都很难跨域通信。因此,您必须正确设置才能让它们与 FB 通信一起工作。请务必为 FB 正确设置 channel 文件。对于 IE,您可以发送 P3P 标头以允许轻松的跨域通信,对于 Safari,这是一项艰巨的工作,但是通过正确设置 FB,它应该可以正常工作(否则,谷歌“跨域通信”可以获得很多该主题的信息)
    • 你是对的,我的 php-sdk 格式错误,我需要登录按钮,因为我的移动网站不在 facebook 上的 iframe 中。它现在正在工作。谢谢你:)
    • 这是唯一真正有效的答案。没有其他解释你必须先使用 JS api 在使用 PHP SDK 之前!
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多