Question

J'utilise CakePHP 2.4 et Facebook PHP SDK 3.2.3 pour créer un formulaire de connexion, qui propose deux options :connexion locale et connexion avec Facebook.j'ai fait référence à Comment intégrer la connexion au SDK Facebook avec cakephp 2.x ? sur la façon de créer des actions de connexion et d'afficher la connexion à Facebook.

Maintenant, j'ai une connexion locale fonctionnelle, et lorsque j'appuie sur pour me connecter à Facebook, je suis redirigé vers Facebook et de nouveau vers mon action de connexion des utilisateurs du plugin.Cependant, je ne reçois aucune réponse $_GET['code'] ou $this->request->query['code'].

Voici mon action de connexion :

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

Sans obtenir de réponse ici, je ne peux pas gérer ma logique de connexion Facebook.

Voici les réponses que je reçois, puis Facebook me redirige vers la page de connexion :enter image description here

Deux requêtes intéressantes (avec paramètres d'URL et emplacement affichés) :

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

OBTENIR le login?code....

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

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

Je trouve étrange que le code ne soit pas un paramètre d'URL dans la première requête, mais il est dans l'URL, la deuxième réponse montre une situation inverse.

OK, cela pourrait donc être un problème de routage.

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

Router::url() renvoie : http://127.0.0.1.xip.io/users/users/login

Mon routeur se connecte :

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

Toutes ces URL redirigent vers : http://127.0.0.1.xip.io/eng/login .Cela peut poser problème, car le SDK Facebook a une URL de redirection différente, il redirige donc vers http://127.0.0.1.xip.io/users/users/login , il y a également une demande de redirection vers http://127.0.0.1.xip.io/eng/login.Le paramètre de requête 'code' peut être perdu après cette redirection.

Était-ce utile?

La solution

Comme on peut le voir dans la console réseau et dans les en-têtes que vous avez publiés, votre serveur effectue une redirection supplémentaire et, comme déjà mentionné dans mon commentaire, c'est là que les paramètres de requête sont perdus.

Il semble que l'URL de redirection que vous transmettez à Facebook soit erronée.

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

qui contient très probablement au moins un excédent users (je ne sais pas d'où cela vient, vous devrez le comprendre par vous-même) sauf si vous utilisez un plugin appelé Users qui contient un contrôleur nommé UsersController, alors peut-être que ça devrait ressembler davantage à

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

Cependant, étant donné que votre serveur redirige vers /eng/login lors de l'accès /users/users/login, il se peut que l'URL de redirection transmise à Facebook soit complètement fausse.

Vous devrez donc d'abord déterminer l'URL appropriée de votre connexion, puis vous assurer que Router::url() (en supposant que vous utilisez le code de la question liée) génère en fait cette URL exacte.

Mise à jour

En regardant votre question mise à jour, je ne vois pas pourquoi l'une de ces routes devrait provoquer une redirection, ce ne sont pas des routes de redirection, mais simplement des routes.La redirection réelle proviendra d’ailleurs.

En cas de redirection vers /eng/login est bien intentionné, alors vous devrez vous assurer que vous transmettez cette URL comme URL de redirection vers Facebook, qui est correctement invoquée Router::url() avec le language clé réglée pour qu'elle corresponde à votre premier itinéraire

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

ou utilisez le persist option dans vos itinéraires afin qu'un appel à Router::url() sans la clé de langue correspondra à votre itinéraire au cas où l'URL actuelle contiendrait l'élément de langue, quelque chose du genre

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'))
);

ou, comme dernière option, incluez la chaîne de requête dans la redirection vers /eng/login

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

Autres conseils

En raison de problèmes de routeur, j'ai modifié le paramètre uri de redirection dans $this->Facebook->getLoginUrl() à 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login' , comme il résout http://127.0.0.1.xip.io/eng/login .

Maintenant je reçois $this->request->query('code') param, donc mon code devrait fonctionner pour l'instant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top