كيفية الحصول على استجابة من Facebook PHP SDK بعد تسجيل الدخول الناجح

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

سؤال

أنا أستخدم CakePHP 2.4 وFacebook PHP SDK 3.2.3 لإنشاء نموذج تسجيل الدخول، والذي يحتوي على خيارين:تسجيل الدخول المحلي وتسجيل الدخول باستخدام الفيسبوك.لقد كنت أشير إلى كيف يمكنني دمج تسجيل دخول 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 توجيهي مرة أخرى إلى صفحة تسجيل الدخول:enter image description here

طلبان مثيران للاهتمام (مع عرض معلمات URL والموقع):

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، والاستجابة الثانية تظهر الوضع العكسي.

حسنًا، قد تكون هذه مشكلة في التوجيه.

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

تقوم جميع عناوين 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.قد يتم فقدان معلمة الاستعلام "code" بعد إعادة التوجيه هذه.

هل كانت مفيدة؟

المحلول

كما يمكن رؤيته في وحدة تحكم الشبكة ومن الرؤوس التي نشرتها، يقوم الخادم الخاص بك بعملية إعادة توجيه إضافية، وكما ذكرنا بالفعل في تعليقي، هذا هو المكان الذي يتم فيه فقدان معلمات الاستعلام.

يبدو أن عنوان 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 تم توجيهه بشكل حاد، فسيتعين عليك التأكد من تمرير عنوان URL هذا كعنوان URL لإعادة التوجيه إلى Facebook، والذي يتم استدعاؤه بشكل صحيح 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