문제

내가 사용하 cakephp 의 2.4Facebook PHP SDK3.2.3 를 만드는 로그인 폼에는 두 개의 옵션:로컬 로그인 및 로그인과 함께 facebook.내가 참조 어떻게 통합 Facebook SDK 로그인 cakephp 의 2.x? 을 만드는 방법에 로그인 작업 및기 위한 Facebook 로그인합니다.

지금 나는 작업 로컬 로그인과 테스를 facebook 로그인,난로 리디렉션 Facebook 에 다시 다시 나 로그인 조치의 플러그인 사용자.그러나 내가 응답이 $_GET['code']$this->request->query['code'].

이 로그인 행동:

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

없이 응답을 받고 여기에,나는 처리할 수 없습니다 내 facebook 로그인 논리입니다.

이들은 응답을 얻을 다음 facebook 리디렉션이 나에게 다시 로그인 페이지:enter image description here

두 개의 흥미로운 요청을(Url params 및 위치는 다음과 같):

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

로그인?코드....

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

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

나는 그것을 찾을 수상한 가진 코드에 URL 을 매개 변수는 먼저 요청 하지만 그것이 URL 에서 두 번째로 응답을 보여줍 역 상황이다.

OK 수 있도록 라우팅 문제입니다.

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

라우터::url()반환합니다: http://127.0.0.1.xip.io/users/users/login

나의 라우터에 연결합니다:

    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 이러한 url 로 리디렉션: http://127.0.0.1.xip.io/eng/login .이 문제로 Facebook SDK 가 다른 URL,그래서 그 다음에 그것을 리디렉션 http://127.0.0.1.xip.io/users/users/login 가,또한 요청을 리디렉션 http://127.0.0.1.xip.io/eng/login.쿼리수'코드'길을 잃을 수있다 후 리다이렉션을.

도움이 되었습니까?

해결책

에서 알 수있는 바와 같이 네트워크는 콘솔에서는 헤더를 게시,서버가 일을 추가로 리디렉션,그리고 이미 언급했듯이에 이은 쿼리를 매개 변수는 손실되는 것.

그것처럼 보이는 리다이렉션하는 URL 을 전달하 Facebook 잘못된 것은

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

을 포함하는 가장 가능성이 적어도 흑자 users (지로 이 줄기에서,당신은 그는 자신에)를 사용하지 않는 플러그인이라고 Users 들어있는 컨트롤러 이름 UsersController, 그래서 어쩌면 그것은 더 보기

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

그러나,고려의 서버로 리디렉션 /eng/login 액세스할 때 /users/users/login, 될 수 있는 URL 을 전달하 Facebook 잘못된 것입니다.

그래서 먼저 해야 합 파악하는 실제적인 적절한 URL 을 로그인,그리고 다음 사항을 확인하십시오 Router::url() (있는 가정에 있는 코드를 사용하여 연결된 질문)실제적으로 생성되는 정확한 URL.

업데이트

보고에서 업데이트 질문이 난 모든 이들의 노선으로 인해 리디렉션,지로 리디렉션 노선이지만,그냥 노선이 있습니다.실제로 리디렉션됩에서 줄기는 다른 곳이다.

을 경우 리디렉션 /eng/login 은 acutally indended,당신은 있는지 확인해야 당신이 전달하는 URL 으로 리디렉션 URL Facebook,는 제대로 invoke Router::url()language 키 설정하도록 일치할 것입니다 당신의 첫 번째 날고있다

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

거나 사용 persist 옵션 노선에도록 전화 Router::url() 없이어와 일치하게 됩니다에는 현재 URL 이 포함되어 언어의 요소의 라인을 따라 뭔가

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

거나,마지막 옵션으로 포함,쿼리에는 문자열을 리디렉션 /eng/login

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

다른 팁

인 라우터 문제가 변경되었을 리디렉션에서 매개 변수 uri $this->Facebook->getLoginUrl() 하기 'redirect_uri' => Router::url('/', true).Configure::read('Config.language').'/login' 으로,그것은 확인 http://127.0.0.1.xip.io/eng/login .

지금 $this->request->query('code') param,그래서 나의 코드를 작동해야한다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top