Facebook身份验证工作流程 - 过于复杂?

时间:2010-07-13 15:59:24

标签: facebook

我正在尝试构建canvas iframe application for Facebook。该应用需要做几件事:

  1. 在Facebook中显示与您的朋友比较的排行榜
  2. 将消息发布到您的墙上
  3. Facebook建议将所有新应用构建为iframe应用,因此使用此API。  我已下载PHP SDK并将示例安装为我的应用程序。

    我很困惑为什么example.php向用户提供登录按钮 - 是不是当前用户已经登录到Facebook?

    我当前的解决方案将用户重定向到http://graph.facebook.com/oauth/authorize进行授权,然后抓取OAuth令牌(稍后发布消息)并返回Facebook画布中的应用程序页面。

    这真的是让当前Facebook用户与我的应用相关联的唯一途径,并获得以后发布消息的权限吗?

3 个答案:

答案 0 :(得分:1)

如果您想在服务器端获取当前登录用户,我发现这样做的最佳方法是尝试进行API调用:

try {
    $response = $facebook->api('/me');
}
catch (FacebookApiException $e) {
    //User not logged in
}

如果通话成功,您现在可以访问登录的用户ID,访问令牌,名称和其他一些基本内容(例如$ facebook-> getUser()或$ facebook-> getSession()) 。否则,如果您发现FacebookApiException,则表示用户未登录,并且需要重定向用户以获取访问令牌。最简单的方法是重定向到$ facebook-> getLoginUrl()(http://github.com/facebook/php-sdk/blob/master/src/facebook.php第322行)返回的网址,您可以传入所需的权限:

$facebook->getLoginUrl(
    array('req_params' => 'email,publish_stream', 
          'next' => 'http://www.redirct-upon-login.com', 
          'cancel' => 'http://www.redirect-if-user-clicks-cancel'));

你基本上可以在Javascript中做同样的事情(我更喜欢,因为有一个弹出对话框/窗口而不是重定向):

FB.login(function(response) {
    if (response.session) {
        if (response.perms.indexOf('publish_stream') != -1) {
            //User has logged in and given us publish_stream permissions
        );
        else {
            //User has logged in but not given us publish_stream        
        }
    }
    else {
    //User is not logged in
}, {perms:'offline_access,publish_stream'});

要回答关于example.php的其他问题,看起来只有在没有用户登录时才会显示登录按钮。否则,它会显示一个注销按钮。

关于重定向,这基本上是OAuth需要工作的方式,如果它是为了安全地允许第三方代表用户采取行动(例如,您的应用程序发布在用户的墙上)。 Facebook需要用户批准您的第三方应用程序以采取行动,因此需要用户证明他/她的身份才能正常运行(否则您可能只是冒充用户)。 Facebook也需要成为一个好的,不是你的应用程序(因此重定向到Facebook的网站),因为如果你的应用程序可以只为用户说话,它就不会很安全。虽然我会同意这是一个痛苦,Facebook的文档对此毫无帮助。

答案 1 :(得分:0)

了解新SDK的getLoginUrl()getLogoutUrl()方法是对用户授予或删除指定权限所需的URL的引用很有帮助 - 不实际登录或退出传统意义上的任何东西。

但是,由于登录或退出站点表明权限发生了变化,因此术语有点适用。

请查看有关javascript身份验证的relevant post

答案 2 :(得分:0)

您可以使用JS SDK自定义显示该按钮的文本(如果您刚开始使用Canvas应用程序,我强烈推荐使用该文本):

<fb:login-button size="medium">Authorize MyCoolApp</fb:login-button>

例如:http://apps.facebook.com/fbrelll/xfbml/fb:login-button

您提到的OAuth方法也可以正常使用。