Cómo obtener la Respuesta de Facebook SDK para PHP después de la Exitosa inicio de sesión
-
21-12-2019 - |
Pregunta
Estoy usando CakePHP 2.4 y Facebook SDK para PHP 3.2.3 crear formulario de inicio de sesión, la cual tiene dos opciones:inicio de sesión local y de inicio de sesión con facebook.Me estoy refiriendo a ¿Cómo puedo integrar Facebook SDK de inicio de sesión con cakephp 2.x? sobre cómo crear inicio de sesión de las acciones y de la vista para Facebook de inicio de sesión.
Ahora he de trabajo de inicio de sesión local, y cuando me presione para facebook login, yo soy redirigido a Facebook y volver de nuevo a mi nombre de la acción de complemento a los Usuarios.Sin embargo no obtengo respuesta en $_GET['code']
o $this->request->query['code']
.
Este es mi nombre de la acción:
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);
}
Sin obtener respuesta aquí, yo no puedo manejar mi facebook de inicio de sesión de la lógica.
Estas son las respuestas que obtenga, a continuación, facebook me redirecciona de nuevo a la página de inicio de sesión:
Dos interesantes las solicitudes (con la Url de parámetros y lugar que se indica):
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#_=_
OBTENER de inicio de sesión?código....
code=AQC_UtjKJU8a2leJMFAB4_1qx1mh1ww0-sRWdAD5vCocfKuZPTF4iSdKYwqxQUsm9N-_1tSPGfh3LYQXbXjYeY2onVBD6gTvJ5amvRZm5ZjI1OSYoLkqgjBsdfjWSdXTigCIQLf5d180keXTCf5jRiOXi8pWi0V2UxXqVl4K9QWWq2qGfSGuXlJMr32NZqKYR0Z93LyR1EiRFJPohfo6-j0kZJrNTkljCbY16Nrq1InqQLdYwGCOSg4IrbR0auaMIWTlnUCKFCr4DT3If_5HPFEDM6ZigeUvURM-q8y-CxDrRIctSmT4Bz1UevPqR-hOMbgKGzYUplatRywzjq_-R7bt
state=9d030270aa50f2e52ac4aa66a37cd0fd
Location: http://127.0.0.1.xip.io/eng/login
Me resulta extraño con código no es parámetro de URL en la primera solicitud, pero es en la dirección URL, la segunda respuesta muestra la situación inversa.
OK, así que esto podría ser problema de enrutamiento.
$this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('plugin'=> 'users', 'controller' => 'users', 'action' => 'login'), true))));
Router::url() devuelve: http://127.0.0.1.xip.io/users/users/login
Mi Router se conecta:
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}'));
Al estas direcciones url redirige a: http://127.0.0.1.xip.io/eng/login
.Esto podría ser un problema, como Facebook SDK tienen diferentes URL de redirección, de modo que, a continuación, se le redirige a http://127.0.0.1.xip.io/users/users/login
, también hay solicitud para redirigir a http://127.0.0.1.xip.io/eng/login
.El parámetro de consulta 'código' puede perderse después de esta redirección.
Solución
Como se puede ver en la consola de la red y la de las cabeceras que se han publicado, su servidor está haciendo un adicional de redirección, y como ya se ha mencionado en mi comentario aquí es donde los parámetros de la consulta se han perdido.
Parece que la URL de redirección que se pasa a Facebook que está mal, es
http://127.0.0.1.xip.io/users/users/login
que contiene más probable es que al menos un superávit users
(no estoy seguro de donde esta se deriva de, usted tendrá la figura que en el suyo propio) a menos que usted está usando un plugin llamado Users
que contiene un controlador llamado UsersController
, así que tal vez debería ser más como
http://127.0.0.1.xip.io/users/login
Sin embargo, teniendo en cuenta que el servidor redirige a /eng/login
cuando se accede a /users/users/login
, puede ser que la URL de redireccionamiento pasado a Facebook que está mal del todo.
Así que primero tendrás que averiguar la actual dirección URL correcta de su nombre de usuario y, a continuación, asegúrese de que Router::url()
(asumiendo que usted está utilizando el código de los enlaces de la pregunta), en realidad, genera que la URL exacta.
Actualización
A partir de la observación actualizado su pregunta, no veo por qué cualquiera de estas rutas deben causar una redirección, que no son redirigir las rutas, pero sólo las rutas.El real redirect madre desde algún otro lugar.
En el caso de la redirección a /eng/login
es en realidad indended, entonces usted tendrá que asegurarse de que usted pasa la URL la URL de redireccionamiento a Facebook, que es invocar correctamente Router::url()
con el language
conjunto de claves para que coincida con su primera ruta
Router::url(
array(
'plugin' => 'users',
'controller' => 'users',
'action' => 'login',
'language' => 'eng'
),
true
);
o utilizar el persist
opción en sus rutas de manera que una llamada a Router::url()
sin el lenguaje clave que coincida con su ruta en caso de que la actual dirección URL contiene el elemento del lenguaje, algo a lo largo de las líneas de
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'))
);
o, como última opción, incluyen la cadena de consulta en la redirección a /eng/login
array(/* other route params */, '?' => $this->request->query)
Otros consejos
Debido a problemas con el Router he cambiado redirigir parámetro uri en $this->Facebook->getLoginUrl()
a 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login'
como se resuelve http://127.0.0.1.xip.io/eng/login
.
Ahora tengo $this->request->query('code')
param, así que mi código debería funcionar por ahora.