2012-04-17 76 views
3

我有一个Facebook应用程序,我授权用户使用PHP SDK。它大部分时间都有效,但有时候不会,我不明白为什么。我正在使用下面的代码。首先,我检查是否有用户,如果我有一个有效的标记(通过请求“/我”)。如果是这样,我退出并显示应用程序。如果没有,我生成一个链接getLoginUrl(),我显示。getLoginUrl随机不工作

当它不起作用时,脚本不断显示此链接。没有错误信息,没有信息为什么它不起作用。

我试着打印$_GET变量,我看到Facebook将两个查询参数附加到我的URL:“状态”和“代码”。有人知道他们是什么吗?

还有什么想法,为什么下面的脚本不工作?有什么我可以检查,以确保它始终有效吗?

$fb_ = new Facebook(array(
    'appId' => 'appid', 
    'secret' => 'secret', 
)); 

$userId = $fb_->getUser(); 
$errorMessage = null; 

if ($userId) { 
    try { 
     $user_ = $fb_->api('/me'); 
     if (isset($user_['error_code'])) { 
      $errorMessage = isset($user_['error_msg']) ? self::$user_['error_msg'] : 'An unknown error occurred'; 
      $errorMessage .= ' (' . $user_['error_code'] . ')'; 
      $user_ = null; 
     } 
    } catch (FacebookApiException $e) { 
     $errorMessage = $e->getMessage(); 
     $user_ = null; 
    } 
} 

if ($user_) return; 

$loginUrl = $fb_->getLoginUrl(array(
    'scope' => 'publish_stream,publish_actions' 
)); 

echo '<!doctype html>'; 
echo '<html xmlns:fb="http://www.facebook.com/2008/fbml">'; 
echo '<head>'; 
echo '<title>' . t('Login to Facebook application') . '</title>'; 
echo '</head>'; 
echo '<body>'; 
if ($errorMessage) echo t('Error: %1', $errorMessage) . '<br/>'; 
echo t('Please login with Facebook first: %1', '<a href="' . $loginUrl . '">' . t('Login with Facebook') . '</a>'); 
echo '</body>'; 
echo '</html>'; 
die(); 

编辑:

按照要求,这里是OAuth的要求:

Request URL:https://www.facebook.com/dialog/oauth?client_id=142896759165492&redirect_uri=http%3A%2F%2Fmxcclient.emarkethink.net%2Flogin&state=ebe253fa859a96e76332935901c32c&scope=publish_stream%2Cpublish_actions 
Request Method:GET 
Status Code:302 Found 

和响应我从Facebook获得:

Cache-Control:private, no-cache, no-store, must-revalidate 
Content-Length:0 
Content-Type:text/html; charset=utf-8 
Date:Tue, 17 Apr 2012 07:47:38 GMT 
Expires:Sat, 01 Jan 2000 00:00:00 GMT 
Location:http://mxcclient.emarkethink.net/login?state=ebe2785a859a96e76332935901c32c&code=AQAN-0ZXg_apegtybid642HOXbU2n5MNl8fYWcPGXiCoFyG7ogJpr53aKBaQKNKz-2wTtPQLpbJd8jAA1fkyw4Kw40Ssylc0b3kFrhnexGJgID8JX-pJEQvKC6wLYL93lQzrA6qFRnS2R6pd0dq-xGLy3YQ-6INC0vQyN_Qhi00M3oAo95b2IeBg4_11E#_=_ 
P3P:CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p" 
Pragma:no-cache 
Set-Cookie:locale=en_US; expires=Tue, 24-Apr-2012 07:47:38 GMT; path=/; domain=.facebook.com 
X-Cnection:close 
X-Content-Type-Options:nosniff 
X-FB-Debug:Wnqw6loUBt4vRR21t7Btve/FPWWrfeoXDxhgiHA= 
X-XSS-Protection:0 

回答

2

好了终于找到了问题是什么:

  • 它在Internet Explorer上无法正常工作,因为应用程序在iframe中运行且未设置P3策略。

  • 由于第三方Cookie被阻止(在iframe中运行的应用程序被视为“第三方”),它在Google Chrome上无法使用。

因此,在这两种情况下,登录成功但授权令牌无法保存,这意味着以下请求失败。