我成功地使用 Facebook SDK (PHP) 将用户连接到我的网站,但是当他们验证他们的帐户时我遇到了问题。他们的帐户已成功通过身份验证,但由于某种原因,我的网站会话被清除。
流动:
- 用户登录我的网站(本地用户名和密码)
- 用户在弹出窗口中连接到 Facebook
- Facebook 对用户进行身份验证并返回到我的网站
- 我的站点会话现在无效(在弹出窗口和主窗口中)导致用户被注销
我正在使用 Facebook SDK (PHP),我的网站使用 CakePHP 框架
任何帮助将不胜感激。
我成功地使用 Facebook SDK (PHP) 将用户连接到我的网站,但是当他们验证他们的帐户时我遇到了问题。他们的帐户已成功通过身份验证,但由于某种原因,我的网站会话被清除。
流动:
我正在使用 Facebook SDK (PHP),我的网站使用 CakePHP 框架
任何帮助将不胜感激。
我不能告诉你是什么删除了你的会话,但你可能想试试这个(对我有用)
使用 Javascript SDK 显示将打开弹出窗口以连接到 FB 的登录按钮
像这样将 js SDK 添加到您的页面:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: '<?php echo FB_API_ID; ?>', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function() {
new Request({
'method': 'get',
'url': '<?php echo $this->Html->url(array('controller'=>'users','action'=>'login_fb'));?>',
'onSuccess': function(result){
window.location.reload();
}
}).send();
});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
如果auth.login
我使用 ajax 调用 /users/login_fb 将使用 Facebook SDK 来检查 facebook 会话:
App::import('Lib', 'facebook_sdk/facebook');
// "MyAuth" is a custom Auth Component that extends the normal Auth component
$this->MyAuth->facebook = new Facebook(array(
'appId' => FB_API_ID,
'secret' => FB_SECRET,
'cookie' => true,
));
$me = null;
$session = $this->MyAuth->facebook->getSession();
if ($session) {
try {
$uid = $this->MyAuth->facebook->getUser();
$me = $this->MyAuth->facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
}
}
if ($me) {
$this->Session->write('FbLogin.session',$session);
$this->Session->write('FbLogin.user',$me);
$UserModel = ClassRegistry::init('User');
$user = $UserModel->findByUid($me['id']);
if(!$user){
$UserModel->create();
$user_data = array( 'username'=>$me['username'],
'name'=>$me['first_name'],
'lastname'=>$me['last_name'],
'email'=>$me['email'],
'group_id'=>GROUP_VISITOR,
'uid'=>$me['id']
);
$UserModel->save($user_data);
$user['User']['id'] = $UserModel->id;
}
$this->Session->write($this->MyAuth->sessionKey, $user['User']);
$this->MyAuth->_loggedIn = true;
}
}
主要思想是..在js中我调用一个ajax来检查fb会话,然后将它保存在蛋糕会话中,js会刷新页面
可能值得检查 Cake 安全级别,它可能正在进行引荐来源检查(我认为它在“高”设置中执行此操作,也可能在“中等”设置中执行此操作),这将使会话无效。
我找不到会话被重置的原因,所以决定不使用 SDK 进行身份验证。这是我改用的。
$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null);
if (empty ($code)) {
$dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope);
header('Location: ' . $dialogUrl);
die;
}
else {
$tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code;
$accessToken = file_get_contents($tokenUrl);
$this->Session->write('facebookAccessToken', $accessToken);
$graphUrl = 'https://graph.facebook.com/me?' . $accessToken;
$fbUser = json_decode(file_get_contents($graphUrl));
if ($fbUser) {
...
}
}