Cómo obtener la Respuesta de Facebook SDK para PHP después de la Exitosa inicio de sesión

StackOverflow https://stackoverflow.com//questions/25030360

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:enter image description here

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top