Como obter a Resposta de Facebook PHP SDK após a conclusão Bem-sucedida de início de sessão

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

Pergunta

Eu estou usando o CakePHP 2.4 e Facebook PHP SDK 3.2.3 para criar o formulário de login, que tem duas opções:local de login e faça login com o facebook.Eu ter sido se referindo a Como faço para integrar o Facebook SDK login com o cakephp 2.x? sobre como criar ações de login e vista para o Facebook login.

Agora eu trabalho local de login, e quando eu pressionar para facebook login, eu sou redirecionado para o Facebook e volta novamente para a minha ação de login do plugin Usuários.No entanto, eu não obter nenhuma resposta no $_GET['code'] ou $this->request->query['code'].

Esta é a minha ação de login:

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

Sem obter resposta aqui, eu não posso segurar meu facebook login lógica.

Estas são respostas que recebo, em seguida, facebook redirecciona-me de volta para a página de login:enter image description here

Duas interessantes pedidos (com Url de parâmetros e local indicado):

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

Início de sessão?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

Acho estranho com o código não é parâmetro de URL na primeira solicitação, mas é na URL, segundo resposta mostra a situação inversa.

OK, então isso pode ser problema de roteamento.

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

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

Meu Roteador 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 essas urls redireciona para: http://127.0.0.1.xip.io/eng/login .Isso pode ser um problema, como o Facebook SDK diferentes URL de redirecionamento, para, em seguida, ele redireciona para http://127.0.0.1.xip.io/users/users/login há também pedido para redirecionar para http://127.0.0.1.xip.io/eng/login.O parâmetro de consulta "código" pode se perder após este redirecionamento.

Foi útil?

Solução

Como pode ser visto no console de rede e o de cabeçalhos que você já postou, seu servidor está fazendo um adicional de redirecionamento, e como já mencionei em meu comentário, este é o lugar onde os parâmetros de consulta estão sendo perdidos.

Parece que o URL de redirecionamento que você está passando para Facebook é errado, é

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

o que contém mais provável que pelo menos um excedente users (não sei onde esta decorre, você vai ter a figura que em seu próprio país), a menos que você estiver usando um plugin chamado Users que contém um controlador chamado UsersController, talvez por isso deveria ser mais como a

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

No entanto, considerando que o servidor redireciona para /eng/login ao acessar /users/users/login, pode ser que o URL de redirecionamento passado para Facebook é completamente errado.

Então, primeiro você vai ter que descobrir o real adequada URL do seu início de sessão e, em seguida, certifique-se de que Router::url() (assumindo que você está usando o código da vinculado questão), na verdade, gera exata URL.

Atualização

Olhando para o seu atualizada pergunta, eu não vejo por qualquer destas rotas deve fazer um redirecionamento, eles não são de redirecionamento de rotas, mas apenas rotas.O real redirecionar vai-tronco a partir de algum outro lugar.

No caso de redirecionamento para /eng/login é dispostos indended, em seguida, você terá que certificar-se de que você passar o URL como o URL de redirecionamento para o Facebook, que é corretamente invocar Router::url() com o language conjunto de chave de modo que ele vai corresponder seu primeiro percurso

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

ou use o persist opção em suas rotas de forma que uma chamada para Router::url() sem a chave de idioma irá corresponder a sua rota no caso de URL contém o idioma elemento, algo ao longo das linhas 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'))
);

ou, como última opção, incluir a seqüência de caracteres de consulta em redirecionar para /eng/login

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

Outras dicas

Devido ao Roteador de problemas eu mudei redirecionar parâmetro uri em $this->Facebook->getLoginUrl() para 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login' , como ele resolve http://127.0.0.1.xip.io/eng/login .

Agora eu fico $this->request->query('code') param, portanto, o meu código deve funcionar agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top