Facebook API SDK(PHP)清除站点会话
我正在成功地使用Facebook SDK(PHP)将用户连接到我的网站,但当他们验证他们的帐户时,我遇到了问题。他们的帐户已成功通过身份验证,但由于某些原因,我的站点的会话已被清除 流量:Facebook API SDK(PHP)清除站点会话,php,session,cakephp,session-cookies,facebook-php-sdk,Php,Session,Cakephp,Session Cookies,Facebook Php Sdk,我正在成功地使用Facebook SDK(PHP)将用户连接到我的网站,但当他们验证他们的帐户时,我遇到了问题。他们的帐户已成功通过身份验证,但由于某些原因,我的站点的会话已被清除 流量: 用户登录我的站点(本地用户名和密码) 用户在弹出窗口中连接到Facebook Facebook验证用户身份并返回到我的网站 “我的站点”会话现在无效(在弹出窗口和主窗口中),导致用户注销 我使用的是Facebook SDK(PHP),我的网站使用的是CakePHP框架 任何帮助都将不胜感激。可能值得检查C
- 用户登录我的站点(本地用户名和密码)
- 用户在弹出窗口中连接到Facebook
- Facebook验证用户身份并返回到我的网站
- “我的站点”会话现在无效(在弹出窗口和主窗口中),导致用户注销
任何帮助都将不胜感激。可能值得检查Cake安全级别,它可能会执行推荐人检查(我认为它在“高”设置下执行此操作,也可能在“中”设置下执行此操作),这将使会话无效。我无法告诉您删除会话的原因,但您可能想尝试一下(适合我) 使用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>
主要思想是。。在js中,我调用ajax检查fb会话,然后将其保存在cake会话中,js将刷新页面我无法找到会话被重置的原因,因此决定不使用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) {
...
}
}
您是使用Javascript SDK显示弹出窗口还是手动执行?我是手动执行。我只是在使用PHPSdkthanks Griff,这是我的第一个想法,但我尝试将级别降低到“低”,仍然会遇到同样的问题。我也以同样的方式使用Twitter API,这不会产生同样的错误。这一定是Facebook SDK中的东西,看起来不错,但我决定不再使用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) {
...
}
}