[英]How to get Response from Facebook PHP SDK after Succesful login
我正在使用CakePHP 2.4和Facebook PHP SDK 3.2.3创建登录表单,该表单具有两个选项:本地登录和使用Facebook登录。 我一直在指我如何将Facebook SDK登录与cakephp 2.x集成在一起? 关于如何创建登录操作和查看Facebook登录的信息。
现在,我可以进行本地登录,当我按Facebook登录时,我将重定向到Facebook,然后再次返回到插件Users的登录操作。 但是我在$_GET['code']
或$this->request->query['code']
没有响应。
这是我的登录操作:
public function login() {
if ($this->Auth->user()) {
$this->Session->setFlash(__('You are already registered and logged in!'), 'flash_info');
$this->redirect('/');
}
if ($this->request->is('post')) {
if ($_SERVER['HTTP_HOST'] == Configure::read('webakis.touchscreen_host')) {
$this->request->data['User']['username'] = $this->request->data['User']['name'] . ' ' . $this->request->data['User']['surname'];
}
if ($this->Auth->login()) {
$this->User->id = $this->Auth->user('id');
$this->User->saveField('last_login', date('Y-m-d H:i:s'));
if ($this->here == $this->Auth->loginRedirect) {
$this->Auth->loginRedirect = '/';
}
$this->Session->setFlash(sprintf(__('%s you have successfully logged in'), $this->Auth->user('name')), 'flash_success');
if (!empty($this->request->data)) {
$data = $this->request->data[$this->modelClass];
$this->_setCookie(array('name' => 'AKIS'), 'User');
}
if (empty($data['return_to'])) {
$data['return_to'] = null;
}
$this->redirect($this->Auth->redirect($data['return_to']));
} else {
$this->Session->setFlash(__('Invalid e-mail / password combination. Please try again'), 'flash_error');
}
}
// When facebook login is used, facebook always returns $_GET['code'].
if($this->request->query('code')){ //Execution doesn't get in here
Debugger::log($this->request->query);
// User login successful
$fb_user = $this->Facebook->getUser(); # Returns facebook user_id
if ($fb_user){
Debugger::log($fb_user);
$fb_user = $this->Facebook->api('/me'); # Returns user information
// We will varify if a local user exists first
$local_user = $this->User->find('first', array(
'conditions' => array('email' => $fb_user['email'])
));
// If exists, we will log them in
if ($local_user){
$this->Auth->login($local_user['User']); # Manual Login
$this->redirect($this->Auth->redirectUrl());
}
// Otherwise we ll add a new user (Registration)
else {
$data['User'] = array(
'username' => $fb_user['email'], # Normally Unique
'password' => AuthComponent::password(uniqid(md5(mt_rand()))), # Set random password
'role' => 'registered'
);
// You should change this part to include data validation
$this->User->save($data, array('validate' => false));
$this->redirect('/');
// After registration we will redirect them back here so they will be logged in
//$this->redirect(Router::url('/users/login?code=true', true));
}
}
}
if (isset($this->request->params['named']['return_to'])) {
$this->set('return_to', urldecode($this->request->params['named']['return_to']));
} else {
$this->set('return_to', false);
}
$allowRegistration = Configure::read('Users.allowRegistration');
$this->set('allowRegistration', (is_null($allowRegistration) ? true : $allowRegistration));
Configure::write('keyboard', 1);
}
在这里没有得到回应,我无法处理我的Facebook登录逻辑。
这些是我得到的回复,然后Facebook将我重定向回登录页面:
两个有趣的请求(显示了网址参数和位置):
GET oauth?....
client_id=671394586273323
ext=1406709978
hash=AeYXzQgAjCbRdY4g
redirect_uri=http://127.0.0.1.xip.io/users/users/login
ret=login
sdk=php-sdk-3.2.3
state=9d030270aa50f2e52ac4aa66a37cd0fd
Location: http://127.0.0.1.xip.io/users/users/login?code=AQC_UtjKJU8a2leJMFAB4_1qx1mh1ww0-sRWdAD5vCocfKuZPTF4iSdKYwqxQUsm9N-_1tSPGfh3LYQXbXjYeY2onVBD6gTvJ5amvRZm5ZjI1OSYoLkqgjBsdfjWSdXTigCIQLf5d180keXTCf5jRiOXi8pWi0V2UxXqVl4K9QWWq2qGfSGuXlJMr32NZqKYR0Z93LyR1EiRFJPohfo6-j0kZJrNTkljCbY16Nrq1InqQLdYwGCOSg4IrbR0auaMIWTlnUCKFCr4DT3If_5HPFEDM6ZigeUvURM-q8y-CxDrRIctSmT4Bz1UevPqR-hOMbgKGzYUplatRywzjq_-R7bt&state=9d030270aa50f2e52ac4aa66a37cd0fd#_=_
获取登录代码?
code=AQC_UtjKJU8a2leJMFAB4_1qx1mh1ww0-sRWdAD5vCocfKuZPTF4iSdKYwqxQUsm9N-_1tSPGfh3LYQXbXjYeY2onVBD6gTvJ5amvRZm5ZjI1OSYoLkqgjBsdfjWSdXTigCIQLf5d180keXTCf5jRiOXi8pWi0V2UxXqVl4K9QWWq2qGfSGuXlJMr32NZqKYR0Z93LyR1EiRFJPohfo6-j0kZJrNTkljCbY16Nrq1InqQLdYwGCOSg4IrbR0auaMIWTlnUCKFCr4DT3If_5HPFEDM6ZigeUvURM-q8y-CxDrRIctSmT4Bz1UevPqR-hOMbgKGzYUplatRywzjq_-R7bt
state=9d030270aa50f2e52ac4aa66a37cd0fd
Location: http://127.0.0.1.xip.io/eng/login
我觉得奇怪的是代码不是第一个请求中的URL参数,而是在URL中,第二个响应显示相反的情况。
好的,所以这可能是路由问题。
$this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('plugin'=> 'users', 'controller' => 'users', 'action' => 'login'), true))));
路由器:: url()返回: http://127.0.0.1.xip.io/users/users/login
: http://127.0.0.1.xip.io/users/users/login
我的路由器连接:
Router::connect('/:language/login', array('plugin' => 'users', 'controller' => 'users', 'action' => 'login'), array('language' => '[a-z]{3}'));
Router::connect('/:language/logout', array('plugin' => 'users', 'controller' => 'users', 'action' => 'logout'), array('language' => '[a-z]{3}'));
Router::connect('/:language/register', array('plugin' => 'users', 'controller' => 'users', 'action' => 'add'), array('language' => '[a-z]{3}'));
Router::connect('/:language/users', array('plugin' => 'users', 'controller' => 'users'), array('language' => '[a-z]{3}'));
Router::connect('/:language/users/index/*', array('plugin' => 'users', 'controller' => 'users'), array('language' => '[a-z]{3}'));
Router::connect('/:language/users/:action/*', array('plugin' => 'users', 'controller' => 'users'), array('language' => '[a-z]{3}'));
Router::connect('/:language/users/users/:action/*', array('plugin' => 'users', 'controller' => 'users'), array('language' => '[a-z]{3}'));
所有这些URL重定向到: http://127.0.0.1.xip.io/eng/login
: http://127.0.0.1.xip.io/eng/login
。 这可能是有问题的,因为Facebook SDK具有不同的重定向URL,因此它将重定向到http://127.0.0.1.xip.io/users/users/login
,也有请求重定向到http://127.0.0.1.xip.io/eng/login
。 此重定向后,查询参数“代码”可能会丢失。
从网络控制台以及您发布的标头中可以看出,您的服务器正在执行其他重定向,正如我的评论中已经提到的,这是丢失查询参数的地方。
您传递给Facebook的重定向URL似乎是错误的,这是
http://127.0.0.1.xip.io/users/users/login
除非您使用的是名为Users
的插件,其中包含一个名为UsersController
的控制器,否则它至少可能包含一个多余的users
(不确定源于何处,您必须自己计算)。所以也许它应该更像
http://127.0.0.1.xip.io/users/login
但是,考虑到您的服务器在访问/users/users/login
/eng/login
时重定向到/eng/login
,可能是传递给Facebook的重定向URL完全错误。
因此,首先您必须找出登录名的实际正确网址,然后确保Router::url()
(假设您使用的是链接问题中的代码)实际上生成了准确的网址。
更新
通过查看您的更新问题,我看不到为什么这些路由中的任何一个都会导致重定向,它们不是重定向路由,而仅仅是路由。 实际的重定向将来自其他地方。
万一确实重定向到/eng/login
,那么您必须确保将该URL作为重定向URL传递给Facebook,即正确调用设置了language
密钥的Router::url()
,以便它会匹配你的第一个路线
Router::url(
array(
'plugin' => 'users',
'controller' => 'users',
'action' => 'login',
'language' => 'eng'
),
true
);
或在您的路由中使用persist
选项,以便在当前URL包含语言元素的情况下,不带语言键的对Router::url()
的调用将与您的路由匹配,如
Router::connect(
'/:language/login',
array('plugin' => 'users', 'controller' => 'users', 'action' => 'login'),
array('language' => '[a-z]{3}', 'persist' => array('language'))
);
// ...
// connect all default routes with a persistent language prefix
Router::connect(
'/:language/:controller/',
array('action' => 'index'),
array('language' => '[a-z]{3}', 'persist' => array('language'))
);
Router::connect(
'/:language/:controller/:action/*',
array(),
array('language' => '[a-z]{3}', 'persist' => array('language'))
);
或者,作为最后一个选择,将查询字符串包含在重定向到/eng/login
的重定向中
array(/* other route params */, '?' => $this->request->query)
由于路由器问题,我将$this->Facebook->getLoginUrl()
中'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login'
重定向uri参数更改为'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login'
,因为它解析为http://127.0.0.1.xip.io/eng/login
。
现在,我得到了$this->request->query('code')
参数,因此我的代码现在应该可以使用了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.