Аутентификация с помощью Facebook (PHP SDK) и Codeigniter - PullRequest
2 голосов
/ 21 марта 2012

Хорошо, вот уже пару дней я пытаюсь интегрировать аутентификацию Facebook в мой сайт на базе Codeigniter.Я включил Facebook PHP SDK в качестве библиотеки, и это, кажется, соединяется очень хорошо, однако, когда я использую метод getUser в SDK, возвращается 0, указывающий, что я не вошел в систему (за исключением того, что я вошел в Facebook).Ниже я включил PHP SDK в виде библиотеки, модель, которая вызывает методы в SDK, контроллер, который собирает данные из модели, и представление, отображающее информацию для пользователя.Я надеюсь, что Йолл может предложить мне несколько советов по этому отягчающему вопросу.Спасибо за вашу помощь заранее!(и только если вам интересно, я использую код из учебника, который я нашел в http://www.dannyherran.com/2011/02/facebook-php-sdk-and-codeigniter-for-basic-user-authentication/):

FB PHP SDK library (хранится в приложении / library):

<?php //if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Copyright 2011 Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

require_once "base_facebook.php";

/**
 * Extends the BaseFacebook class with the intent of using
 * PHP sessions to store user ids and access tokens.
 */
class Facebook extends BaseFacebook
{
  /**
   * Identical to the parent constructor, except that
   * we start a PHP session to store the user ID and
   * access token if during the course of execution
   * we discover them.
   *
   * @param Array $config the application configuration.
   * @see BaseFacebook::__construct in facebook.php
   */
  public function __construct($config) {
    if (!session_id()) {
      session_start();
    }
    parent::__construct($config);
  }

  protected static $kSupportedKeys =
    array('state', 'code', 'access_token', 'user_id');

  /**
   * Provides the implementations of the inherited abstract
   * methods.  The implementation uses PHP sessions to maintain
   * a store for authorization codes, user ids, CSRF states, and
   * access tokens.
   */
  protected function setPersistentData($key, $value) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to setPersistentData.');
      return;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    $_SESSION[$session_var_name] = $value;
  }

  protected function getPersistentData($key, $default = false) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to getPersistentData.');
      return $default;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    return isset($_SESSION[$session_var_name]) ?
      $_SESSION[$session_var_name] : $default;
  }

  protected function clearPersistentData($key) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to clearPersistentData.');
      return;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    unset($_SESSION[$session_var_name]);
  }

  protected function clearAllPersistentData() {
    foreach (self::$kSupportedKeys as $key) {
      $this->clearPersistentData($key);
    }
  }

  protected function constructSessionVariableName($key) {
    return implode('_', array('fb',
                              $this->getAppId(),
                              $key));
  }
}
?>

Модель:

<?php

/*
 * Copyright 2011 Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */


class Facebook_model extends CI_Model {

    public function __construct(){
        parent::__construct();

        $profile = null;
        // Create our Application instance (replace this with your appId and secret).
        $config = array(
                        'appId'  => 'MYAPPID',
                        'secret' => 'MYSECRET',
                        'fileUpload' => true, // Indicates if the CURL based @ syntax for file uploads is enabled.
                    );

        echo $this->load->library('Facebook', $config);

        // Get User ID
        $user = $this->facebook->getUser();

        // We may or may not have this data based on whether the user is logged in.
        //
        // If we have a $user id here, it means we know the user is logged into
        // Facebook, but we don't know if the access token is valid. An access
        // token is invalid if the user logged out of Facebook.

        $profile = null;
        if($user)
        {
            try {
                // Proceed knowing you have a logged in user who's authenticated.
                $profile = $this->facebook->api('/me?fields=id,name,link,email');
            } catch (FacebookApiException $e) {
                error_log($e);
                $user = null;
            }
        }


        $fb_data = array(
                        'me' => $profile,
                        'uid' => $user,
                        'loginUrl' => $this->facebook->getLoginUrl(
                            array(
                                'scope' => 'email,user_birthday,publish_stream', // app permissions
                                'redirect_uri' => '/profile' // URL where you want to redirect your users after a successful login
                            )
                        ),
                        'logoutUrl' => $this->facebook->getLogoutUrl(),
                    );

         $this->session->set_userdata('fb_data', $fb_data);

    }

}

?>

Контроллер:

<?php

    class The_facebook extends CI_Controller {

        public function __construct(){
            parent::__construct();
            $this->load->model('facebook_model');
        }

        public function index(){
            print_r($this->facebook);
            $fb_data = $this->session->userdata('fb_data'); // This array contains all the user FB information

            if((!$fb_data['uid']) or (!$fb_data['me']))
            {
                // If this is a protected section that needs user authentication
                // you can redirect the user somewhere else
                // or take any other action you need
                //redirect(base_url());
                echo "redirect";    

            }
            else
            {
                $data = array(
                        'fb_data' => $fb_data,
                      );

                $this->load->view('sand_view', $data);
            }

        }

    }

?>

И, наконец, вид:

<body>
<div>
  <?php if(!$fb_data['me']): ?>
  Please login with your FB account: <a href="<?php echo $fb_data['loginUrl']; ?>">login</a>
  <!-- Or you can use XFBML -->
  <div class="fb-login-button" data-show-faces="false" data-width="100" data-max-rows="1" data-scope="email,user_birthday,publish_stream"></div>
  <?php else: ?>
  <img src="https://graph.facebook.com/<?php echo $fb_data['uid']; ?>/picture" alt="" class="pic" />
  <p>Hi <?php echo $fb_data['me']['name']; ?>,<br />
    <a href="<?php echo site_url('topsecret'); ?>">You can access the top secret page</a> or <a href="<?php echo $fb_data['logoutUrl']; ?>">logout</a> </p>
  <?php endif; ?>
</div>
</body>

Ответы [ 3 ]

1 голос
/ 25 января 2013

Я уже некоторое время работаю с Facebook SDK над CodeIgniter и решил выпустить свой код как расширение с открытым исходным кодом. Есть одна вещь: этот код использует SDK в качестве библиотеки и построил модель поверх него, имея несколько других потрясающих функций, готовых к использованию.

Если вы хотите использовать его или внести какой-либо вклад (проблемы, коммиты и т. Д.), Присоединяйтесь:

https://github.com/AlphabaseIT/CIconnect

1 голос
/ 22 марта 2012

У меня была такая же проблема, и я понял, что я добавил массив config в конструктор класса facebook вместо того, чтобы передавать его в качестве параметра конструктору.По какой-то причине массив конфигурации не был передан или прочитан.

, поэтому мой хак выглядит следующим образом:

    public function __construct() {
    if (!session_id()) {
        session_start();
    }


    $config = array(
        'appId' => FACEBOOK_APP_ID,
        'secret' => FACEBOOK_SECRET
    );

    parent::__construct($config);
}

Надеюсь, это поможет.

0 голосов
/ 16 июля 2013

Я создал собственную интеграцию, вы можете скачать ее здесь с GitHub: https://github.com/cworsley4/Codeigniter-with-Facebook

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...