Facebook认证工作流程-过于复杂?

Facebook认证工作流程-过于复杂?,facebook,Facebook,我正试图建立一个新的世界。该应用程序需要做几件事: 在Facebook中显示一个排行榜,将你与你的朋友进行比较 在墙上留言 Facebook建议将所有新应用构建为iframe应用,因此使用此API。 我已经下载了PHPSDK,并将示例安装为我的应用程序 我不明白为什么example.php会向用户显示一个登录按钮——这不是当前用户已经登录到Facebook的想法吗 我当前的解决方案将用户重定向到以获得授权,然后获取OAuth令牌(用于稍后发布消息)并返回到Facebook画布中的应用程序页面 这

我正试图建立一个新的世界。该应用程序需要做几件事:

  • 在Facebook中显示一个排行榜,将你与你的朋友进行比较
  • 在墙上留言
  • Facebook建议将所有新应用构建为iframe应用,因此使用此API。 我已经下载了PHPSDK,并将示例安装为我的应用程序

    我不明白为什么example.php会向用户显示一个登录按钮——这不是当前用户已经登录到Facebook的想法吗

    我当前的解决方案将用户重定向到以获得授权,然后获取OAuth令牌(用于稍后发布消息)并返回到Facebook画布中的应用程序页面


    这真的是唯一能让当前Facebook用户与我的应用程序关联并获得以后发布消息的权限的方法吗?

    了解
    getLoginUrl()
    getLogoutUrl()
    新SDK的方法引用了用户授予或删除指定权限所需的URL,而不是传统意义上的实际登录或注销

    尽管如此,这个术语还是有点合适,因为登录或退出站点表示权限发生了变化


    查看有关javascript身份验证的信息。

    您可以使用自定义按钮显示的文本(如果您刚刚开始使用画布应用程序,我强烈建议您使用):

    授权MyCoolApp
    
    例如:


    您提到的OAuth方法也可以正常工作。

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

    try {
        $response = $facebook->api('/me');
    }
    catch (FacebookApiException $e) {
        //User not logged in
    }
    
    如果调用成功,您现在可以访问登录的用户id、访问令牌、名称和其他一些基本内容(例如$facebook->getUser()或$facebook->getSession()。否则,如果捕获到FacebookApiException,则您知道该用户未登录,需要重定向该用户以获取访问令牌。最简单的方法是重定向到$facebook->getLoginUrl()返回的url(第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中执行相同的操作(我更喜欢它,因为它有一个弹出对话框/窗口,而不是重定向):

    要回答example.php上的另一个问题,似乎只有在没有用户登录的情况下才会显示登录按钮。否则,它会显示一个注销按钮

    关于重定向,如果OAuth要安全地允许第三方代表用户采取行动(例如,您在用户墙上发布的应用程序),那么它基本上就是这样工作的。Facebook需要用户批准你的第三方应用程序才能采取行动,因此需要用户证明他/她的身份才能批准(否则你可以冒充用户)。Facebook也需要这样做,而不是你的应用程序(因此重定向到Facebook的网站),因为如果你的应用程序只能代表用户说话,那就根本不安全了。这是一种痛苦,尽管我同意,Facebook的文档对这一点也没有帮助

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