坚果壳中的问题
我需要能够在CakePHP中跨多个AJAX请求维护会话。目前,会话在每个AJAX请求中都会丢失。
背景
我正在尝试将Facebook应用程序的服务器端(PHP-SDK)身份验证转换为使用客户端(JS-SDK)身份验证。该应用程序使用CakePHP构建,并使用Auth组件。
我想要实现的用户流程如下:
我遇到的问题是上述流程的第5步。特别是,$this->Auth->loggedIn()
在第二次(和后续)AJAX调用中返回false,并且我收到HTTP 403错误。根据我的观察,似乎没有维护会话,因为$this->Session->id()
为每个AJAX调用返回不同的值。
我在StackOverflow上看了很多类似的问题,但还没找到合适的答案。我看过一些人:
这是我的会话配置:
Configure::write('Session', array(
'defaults' => 'database',
'checkAgent' => false,
'ini' => array(
'session.cookie_secure' => false,
'session.referer_check' => false,
'session.cookie_httponly' => false
)
));
我也试过Configure::write('Security.level', 'medium')
也无济于事。
如果有帮助,这是我用于AJAX登录的代码:
public function ajax_login() {
$this->autoRender = false;
$data = array();
$accessToken = $this->request->data['access_token'];
$response = null;
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/oauth/access_token?client_id=' . FACEBOOK_SECURITY_APP_ID . '&client_secret=' . FACEBOOK_SECURITY_SECRET . '&grant_type=fb_exchange_token&fb_exchange_token=' . $accessToken);
parse_str(curl_exec($ch), $response);
curl_close($ch);
$newAccessToken = $response['access_token'];
FB::setAccessToken($newAccessToken);
try {
$facebookUser = FB::api('/me', 'GET', array('fields' => 'id,username,first_name,last_name,email'));
//Log in user
//NOTE:: FB::getUser() returns 0 for some reason
if ($facebookUser) {
$isLoggedIn = $this->Auth->loggedIn();
//Log out app user if Facebook IDs do not match
if ($isLoggedIn) {
$appUser = $this->User->find('first', array(
'conditions' => array('id' => $this->Auth->user('id')),
'recursive' => -1
));
if ($appUser && $appUser['User']['facebook_id'] != $facebookUser['id']) {
$this->Auth->logout();
}
}
//Log in Facebook user
$user = $this->User->findOrCreate($facebookUser);
if (!$isLoggedIn) {
$this->Auth->login($user['User']);
}
}
//Log out app user if Facebook authentication fails
else if ($this->Auth->loggedIn()) {
$this->Auth->logout();
}
}
catch (FacebookApiException $e) {
$data['error'] = $e->getResult();
}
$data['status'] = $this->Auth->loggedIn() ? 1 : 0;
echo json_encode($data);
}
其他要点
$this->User->findOrCreate()
是一个自定义方法,添加确定提供的Facebook用户是否为现有用户,如果不是,则将记录插入数据库,并返回找到或创建的用户。加成
如果有人能够另外解释为什么上面代码中的FB :: getUser()返回0,虽然FB :: api('/ me')可以工作,但会很棒。
答案 0 :(得分:0)
我一直在使用Nick的Facebook插件。
当您连接Facebook时,该插件将自动登录用户(如果没有帐户,则创建用户记录)。听起来你想要做的事情已经被插件处理了。
我错过了什么吗?