Frage

Ich verwende CakePHP 2.4 und Facebook PHP SDK 3.2.3, um ein Anmeldeformular zu erstellen, das zwei Optionen bietet:Lokales Login und Login mit Facebook.Ich habe mich darauf bezogen Wie integriere ich die Facebook SDK-Anmeldung mit cakephp 2.x? Informationen zum Erstellen und Anzeigen von Anmeldeaktionen für die Facebook-Anmeldung.

Jetzt habe ich eine funktionierende lokale Anmeldung, und wenn ich auf „Facebook-Anmeldung“ drücke, werde ich zu Facebook und wieder zurück zu meiner Anmeldeaktion für Plugin-Benutzer weitergeleitet.Allerdings bekomme ich keine Antwort $_GET['code'] oder $this->request->query['code'].

Das ist meine Login-Aktion:

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

Ohne hier eine Antwort zu erhalten, komme ich mit meiner Facebook-Anmeldelogik nicht zurecht.

Dies sind die Antworten, die ich bekomme, wenn Facebook mich zurück zur Anmeldeseite weiterleitet:enter image description here

Zwei interessante Anfragen (mit angezeigten URL-Parametern und Standort):

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

Login-Code ERHALTEN....

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

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

Ich finde es seltsam, dass der Code in der ersten Anfrage kein URL-Parameter ist, sondern in der URL, die zweite Antwort zeigt die umgekehrte Situation.

OK, das könnte also ein Routing-Problem sein.

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

Router::url() gibt Folgendes zurück: http://127.0.0.1.xip.io/users/users/login

Mein Router verbindet:

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

Alle diese URLs leiten weiter zu: http://127.0.0.1.xip.io/eng/login .Dies könnte ein Problem sein, da das Facebook SDK eine andere Weiterleitungs-URL hat und dann zu weiterleitet http://127.0.0.1.xip.io/users/users/login , es gibt auch eine Anfrage zur Weiterleitung http://127.0.0.1.xip.io/eng/login.Der Abfrageparameter „code“ kann nach dieser Umleitung verloren gehen.

War es hilfreich?

Lösung

Wie in der Netzwerkkonsole und den von Ihnen geposteten Headern zu sehen ist, führt Ihr Server eine zusätzliche Umleitung durch, und wie bereits in meinem Kommentar erwähnt, gehen hier die Abfrageparameter verloren.

Es sieht so aus, als ob die Weiterleitungs-URL, die Sie an Facebook weitergeben, falsch ist

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

die höchstwahrscheinlich zumindest einen Überschuss enthält users (Ich bin mir nicht sicher, woher das kommt, das müssen Sie selbst herausfinden), es sei denn, Sie verwenden ein Plugin namens Users die einen Controller mit dem Namen enthält UsersController, also sollte es vielleicht eher so sein

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

Bedenken Sie jedoch, dass Ihr Server zu weiterleitet /eng/login beim Zugriff /users/users/login, kann es sein, dass die an Facebook übergebene Weiterleitungs-URL völlig falsch ist.

Sie müssen also zunächst die richtige URL für Ihr Login herausfinden und dann sicherstellen, dass dies der Fall ist Router::url() (vorausgesetzt, Sie verwenden den Code aus der verlinkten Frage) generiert tatsächlich genau diese URL.

Aktualisieren

Wenn ich mir Ihre aktualisierte Frage ansehe, verstehe ich nicht, warum eine dieser Routen eine Umleitung verursachen sollte. Es handelt sich nicht um Umleitungsrouten, sondern nur um Routen.Die eigentliche Weiterleitung wird von woanders herrühren.

Falls die Weiterleitung zu /eng/login tatsächlich eingerückt ist, müssen Sie sicherstellen, dass Sie diese URL als Weiterleitungs-URL an Facebook übergeben, also ordnungsgemäß aufrufen Router::url() mit dem language Legen Sie den Schlüssel so fest, dass er zu Ihrer ersten Route passt

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

oder nutzen Sie die persist Option in Ihren Routen, damit ein Anruf erfolgt Router::url() ohne den Sprachschlüssel wird Ihre Route übereinstimmen, falls die aktuelle URL das Sprachelement enthält, etwa in der Art von

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

Oder fügen Sie als letzte Option die Abfragezeichenfolge in die Weiterleitung ein /eng/login

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

Andere Tipps

Aufgrund von Routerproblemen habe ich den Umleitungs-URI-Parameter in geändert $this->Facebook->getLoginUrl() Zu 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login' , wie es sich auflöst http://127.0.0.1.xip.io/eng/login .

Jetzt verstehe ich $this->request->query('code') param, also sollte mein Code vorerst funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top