这是做FB Connect的正确方法吗?

时间:2011-03-26 02:01:32

标签: php facebook

1)用户点击“使用Facebook登录”

2)将用户重定向到http://www.facebook.com/dialog/oauth?client_id=xx&redirect_url=xxx&etcetc

3)用户点击允许,返回我们的网站。

4)我们可以获取用户的姓名,电子邮件以及我们获得许可的其他设置,并使用该设置,我们可以使用随机密码在我们的网站上为他创建一个帐户。

5)下次用户点击此按钮,如果我们已在我们的网站上有他的帐户(使用电子邮件地址进行比较),我们只需在步骤4中自动登录

1 个答案:

答案 0 :(得分:1)

绝对使用SDK。它的优点是它是一个在野外测试和使用的库。当你不需要时,永远不要重建轮子(你会发现你做得更多;)。)。

我最后在CI中做的是将Facebook PHP SDK添加到我的库目录,并将__construct类的Facebook函数更改为:

public function __construct()
{
    $ci =& get_instance();

    $this->setAppId($ci->config->item('fb_appId'));
    $this->setApiSecret($ci->config->item('fb_secret'));
    $this->setCookieSupport($ci->config->item('fb_cookie'));
    $this->setBaseDomain($ci->config->item('fb_domain'));
    $this->setFileUploadSupport($ci->config->item('fb_upload'));
}

然后,

  • 我将所有上述键/值对添加到config / config.php
  • 将facebook库添加到自动加载列表

完成后,我可以通过$this->facebook从我的应用中的任何位置访问FB API。

说了这么多,这都是2.0之前的,所以我不完全确定如果需要会有什么变化(我现在正在使用Yii,这主要是为什么我不知道是否需要更改:))

希望有所帮助。

修改

根据要求,我最后添加了UserModel类(扩展Model)。我支持多个登录提供程序,所以我不会发布整个事情。但是,这是它的要点:

class UserModel extends Model
{
        private $m_user;

        public function UserModel()
        {
                parent::Model();

                $this->m_user = null;

                $session = $this->facebook->getSession();
                if($session)
                {
                        if($this->facebook->api('/me') != null)
                        {
                                $this->m_user = $this->facebook->api('/me');
                        }
                }
        }

        public function getUser()
        {
                return $this->m_user;
        }

        public function isLoggedIn()
        {
                return $this->getUser() != null;
        }

        // returns either the login or logout url for the given provider, relative to the
        // state that the current user object is in
        public function getActionUrl()
        {
                if($this->isLoggedIn())
                {
                        return $this->facebook->getLogouturl();
                }
                else
                {
                        return $this->facebook->getLoginUrl(array('next'=>currentUrl(), 'cancel'=>currentUrl(), 'req_perms'=>null, 'display'=>'popup'));
                }
        }
}

然后,我添加了一个登录小部件,其中只包含以下内容:

<div id="header-login">
        <!-- todo: this won't work with konqueror atm (fb script bugs) - check 'em out later -->
        <?php if(!$user->isLoggedIn()): ?>
        <fb:login-button perms="email"><?php echo lang('fb_login'); ?></fb:login-button>
        <?php else: ?>
        <a onclick="FB.logout();" class="fb_button fb_button_medium"><span class="fb_button_text">Logout</span></a>
        <?php endif; ?>
</div>

第二次修改:

很抱歉,自从我写这篇文章已经有一段时间了,所以我不得不回过头来弄清楚它是如何实现的:P经过快速的grep后,我发现我实际上并没有在任何地方使用getActionUrl 。我添加了一些客户端脚本来监听FB登录/注销事件:

google.setOnLoadCallback(on_load);
google.load("jquery", "1.4.4");

window.fbAsyncInit = function() {
        FB.init({appId: '[id]', status: true, cookie: true, xfbml: true});
        FB.Event.subscribe('auth.login', on_fb_login);
        FB.Event.subscribe('auth.logout', on_fb_logout);
};

function on_load()
{
        // force all anchors with the rel tag "ext" to open in an external window
        // (replaces target= functionality)
        $('a[rel="ext"]').click(function(){
                window.open(this.href);
                return false;
        });
}

function on_fb_login()
{
        location.reload();
}

function on_fb_logout()
{
        location.reload();
}