1)用户点击“使用Facebook登录”
2)将用户重定向到http://www.facebook.com/dialog/oauth?client_id=xx&redirect_url=xxx&etcetc
3)用户点击允许,返回我们的网站。
4)我们可以获取用户的姓名,电子邮件以及我们获得许可的其他设置,并使用该设置,我们可以使用随机密码在我们的网站上为他创建一个帐户。
5)下次用户点击此按钮,如果我们已在我们的网站上有他的帐户(使用电子邮件地址进行比较),我们只需在步骤4中自动登录
答案 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'));
}
然后,
完成后,我可以通过$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();
}