Domanda

Sto usando CakePHP 2.4 e Facebook PHP SDK 3.2.3 per creare il modulo di accesso, che ha due opzioni: Login locale e accedi con Facebook. Mi riferisco a Come posso integrare Facebook Login SDK con cakephp 2.x? su come creare azioni di accesso e visualizzare per il login di Facebook.

Ora ho lavorato login locale e quando premo il login di Facebook, sono reindirizzato su Facebook e torna indietro alla mia azione di accesso degli utenti del plugin. Comunque non ottengo alcuna risposta in $_GET['code'] o $this->request->query['code'].

Questa è la mia azione di accesso:

    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);
}
.

Senza ricevere la risposta qui, non riesco a gestire la mia logica di accesso a Facebook.

Queste sono risposte che ottengo quindi Facebook mi reindirizza alla pagina di accesso: Inserire la descrizione dell'immagine qui

Due richieste interessanti (con URL parametri e posizione visualizzati):

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#_=_
.

Ottieni login? Codice ....

code=AQC_UtjKJU8a2leJMFAB4_1qx1mh1ww0-sRWdAD5vCocfKuZPTF4iSdKYwqxQUsm9N-_1tSPGfh3LYQXbXjYeY2onVBD6gTvJ5amvRZm5ZjI1OSYoLkqgjBsdfjWSdXTigCIQLf5d180keXTCf5jRiOXi8pWi0V2UxXqVl4K9QWWq2qGfSGuXlJMr32NZqKYR0Z93LyR1EiRFJPohfo6-j0kZJrNTkljCbY16Nrq1InqQLdYwGCOSg4IrbR0auaMIWTlnUCKFCr4DT3If_5HPFEDM6ZigeUvURM-q8y-CxDrRIctSmT4Bz1UevPqR-hOMbgKGzYUplatRywzjq_-R7bt
state=9d030270aa50f2e52ac4aa66a37cd0fd

Location:   http://127.0.0.1.xip.io/eng/login
.

Trovo che lo strano con il codice non è il parametro URL in prima richiesta, ma è in URL, la seconda risposta mostra la situazione inversa.

OK, quindi questo potrebbe essere il problema di routing.

    $this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('plugin'=> 'users', 'controller' => 'users', 'action' => 'login'), true)))); 
.

Router :: URL () Restituisce: http://127.0.0.1.xip.io/users/users/login

Il mio router si collega:

    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 Questi URL reindirizzano a: http://127.0.0.1.xip.io/eng/login. Questo potrebbe essere un problema, poiché lo SDK di Facebook ha un diverso URL di reindirizzamento, quindi reindirizza a http://127.0.0.1.xip.io/users/users/login, è inoltre richiesta di reindirizzare a http://127.0.0.1.xip.io/eng/login. Il parametro di query 'Codice' potrebbe perdersi dopo questo reindirizzamento.

È stato utile?

Soluzione

Come si può vedere nella console di rete e nelle intestazioni che hai pubblicato, il tuo server sta facendo un ulteriore reindirizzamento, e come già menzionato nel mio commento, è qui che i parametri della query vengono persi. Sembra che l'URL di reindirizzamento che stai passando a Facebook sia sbagliato, è

http://127.0.0.1.xip.io/users/users/login

che contiene probabilmente almeno un generatore di surplus users (non sicuro di dove deriva, dovrai capire che da solo) a meno che tu non stia utilizzando un plug-in chiamato Users che contiene un controller denominato UsersController, quindi forse dovrebbe essere più simile a

http://127.0.0.1.xip.io/users/login

Tuttavia, considerando che il server reindirizza a /eng/login quando si accede a /users/users/login, potrebbe essere che l'URL di reindirizzamento passato a Facebook sia completamente sbagliato.

Quindi prima dovrai capire l'URL corretto effettivo del tuo login, quindi assicurati che Router::url() (supponendo che tu stia utilizzando il codice dalla domanda collegata) effettivamente genera quell'URL esatto.

Aggiornamento

Dall'esiderando la tua domanda aggiornata, non vedo perché nessun di questi percorsi dovrebbe causare un reindirizzamento, non reindirizzano rotte, ma solo percorsi. Il reindirizzamento effettivo deriverà da qualche altra parte.

Nel caso in cui il reindirizzamento di GeneracodicitagCode sia indicato acutamente, allora dovrai assicurarsi di passare quel URL come URL di reindirizzamento su Facebook, che richiama correttamente /eng/login con il set di tasti Router::url() in modo che corrisponderà al tuo primo percorso

Router::url(
    array(
        'plugin' => 'users',
        'controller' => 'users',
        'action' => 'login',
        'language' => 'eng'
    ),
    true
);
.

o Utilizzare l'opzione language nei tuoi percorsi in modo che una chiamata a persist senza il tasto della lingua corrisponda al percorso nel caso in cui l'URL corrente contiene l'elemento della lingua, qualcosa sulla riga di

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, come ultima opzione, includere la stringa di query nel reindirizzamento a Router::url()

array(/* other route params */, '?' => $this->request->query)
.

Altri suggerimenti

A causa dei problemi del router ho modificato il parametro di reindirizzamento URI in $this->Facebook->getLoginUrl() a 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login', in quanto si risolve in http://127.0.0.1.xip.io/eng/login.

Ora ottengo il param $this->request->query('code'), quindi il mio codice dovrebbe funzionare per ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top