如何使用Facebook PHP SDK将用户登录到我的应用程序?

时间:2011-08-09 17:28:40

标签: facebook oauth-2.0 facebook-php-sdk

我刚开始使用Facebook API进行开发,所以提前感谢您耐心帮助我解决问题。

我正在使用 Facebook PHP SDK 3 来检查状态令牌和用户令牌代码以验证身份验证,但似乎它只有在我通过Facebook点击应用时才有效。


逐步更详细:

(1)删除应用程序权限>要重新开始并尝试进行故障排除我登录Facebook并删除我对应用程序的用户访问权限,以便系统再次提示我接受权限。

(2)刷新网页应用>然后我刷新我的应用程序,它不知道我有一个Facebook会话!

当我登录Facebook时,应用程序是否应该至少能够看到我的Facebook用户ID?

从我的用户删除应用程序是否导致应用程序失去所有访问权限?

(3)退出Facebook,刷新应用>由于这不起作用,我退出Facebook并刷新我的网络应用程序重新开始。

根据$ user信息生成Facebook登录或退出链接

public function run(){

  $FB = &$this->getFacebook();
  $user = $FB->getUser();

  $user_dat = $FB->api('/me');
  $logoutUrl = $FB->getLoginUrl(array('scope'=> $fbPermissions,'redirect_uri'=> $appBaseURL)); 
  $loginUrl = $FB->getLogoutUrl();

    ?>
    <h1>php-sdk</h1>

    <?php if ($user): ?>
      <a href="<?php echo $logoutUrl; ?>">Logout</a>
    <?php else: ?>
      <div>
        Login using OAuth 2.0 handled by the PHP SDK:
        <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
      </div>
    <?php endif ?>
    <?php if ($user): ?>
      <h3>You</h3>
      <img src="https://graph.facebook.com/<?php echo $user; ?>/picture">
      <h3>Your User Object (/me)</h3>
      <pre><?php print_r($user_dat); ?></pre>
    <?php else: ?>
      <strong><em>You are not Connected.</em></strong>
    <?php endif ?>
<?php   } ?>

(4)点击生成的登录链接&gt; FB登录链接在我的网络应用程序(Facebook外)生成我点击它并重定向到Facebook登录。

生成的登录网址

https://www.facebook.com/login.php?
api_key=112233445566778
&skip_api_login=1
&display=page&
cancel_url=http://www.mywebapp.com/app/beta/?error_reason=user_denied&error=access_denied
&error_description=The+user+denied+your+request.
&state=99ff88cc33dd77aa11bb00cc2266dd11
&fbconnect=1
&next=https://www.facebook.com/connect/uiserver.php?method=permissions.request
&app_id=112233445566778
&display=page
&redirect_uri=http://www.mywebapp.com/app/beta/?response_type=code&state=99ff88cc33dd77aa11bb00cc2266dd11
&fbconnect=1
&perms=user_about_me,user_activities,user_likes,email,user_online_presence,read_friendlists,manage_notifications,publish_stream
&from_login=1
&rcount=1

(5)登录Facebook,允许应用权限&gt;我登录然后它然后要求我允许我的应用程序的权限,我点击“允许”,Facebook通过此URL将我重定向回我的应用程序。

http://www.mywebapp.com/app/beta/?
code=ABCxxx
&state=b3f5efffc496b3f5efff38e32604e3

然而,当我回到应用程序时,我的服务器错误日志会发出错误消息:

[error] ***CSRF state token does not match one provided.***

应用程序认为我还没有登录,也没有显示任何用户信息!

在用户通过Ouath接受应用程序权限后,应用程序的状态令牌看起来与Facebook返回的状态令牌不匹配。

在这种情况下,我作为登录链接的一部分发送的状态令牌是:

state=9655d77aa198fc0a29774694134dd0c7

然后facebook用状态令牌将我重定向回我的应用程序!

state=b3f5efffa4169f3c4b816838e32604f5

我发送的令牌实际上看起来像上一个会话中的令牌,所以我想我可能需要在再次登录之前清除会话信息。这似乎不是在Facebook SDK中发生的,所以我需要自己实现吗?

(6)在Facebook上刷新Web应用程序&gt;然后,为了确保我不疯狂,我去Facebook,看到我登录,然后我通过Facebook点击网络应用程序

http://apps.facebook.com/mywebapp/

你知道什么,我的应用程序显示了我的所有用户信息,用户访问令牌以及Facebook内的所有内容,但是= /

(7)刷新独立应用&gt;然后我回到我的webapp - 刷新它 - 现在它也有所有信息!

我无法使用PHP SDK登录我的应用程序有什么问题?

为什么我的应用程序在不在应用程序上时看不到Facebook用户ID?

1 个答案:

答案 0 :(得分:2)

这真的很愚蠢,但基本上API已被打破。 Facebook最近解决了这个问题,现在我不再遇到这些问题! = /