使用Facebook(PHP SDK)和Codeigniter进行身份验证

时间:2012-03-21 18:29:54

标签: php facebook codeigniter facebook-php-sdk facebook-authentication

好吧,所以几天后我一直试图将Facebook身份验证整合到我的基于Codeigniter的网站中。我已将Facebook PHP SDK作为库包含在内并且似乎连接得很好,但是当我在SDK中使用getUser方法时,返回0表示我没有登录(除了我登录到facebook)。下面我以库的形式包含了PHP SDK,调用SDK中方法的模型,从模型中捕获数据的控制器以及向用户显示信息的视图。我希望yall可以为我这个加重问题提供一些帮助。感谢您的所有帮助! (并且只是因为我想知道我正在使用我在http://www.dannyherran.com/2011/02/facebook-php-sdk-and-codeigniter-for-basic-user-authentication/上找到的教程中的一些代码):

FB PHP SDK库(存储在应用程序/库中):

<?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 个答案:

答案 0 :(得分:1)

我遇到了同样的问题而我的hack是我将配置数组添加到facebook类的构造函数中,而不是将其作为参数传递给构造函数。由于某种原因,配置数组没有被传递或读取。

所以我的黑客看起来如下:

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


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

    parent::__construct($config);
}

希望这有帮助。

答案 1 :(得分:1)

我一直在CodeIgniter上使用Facebook SDK,并决定将我的代码作为开源扩展程序发布。 有一件事:这段代码使用SDK作为库,并在其上构建了一个模型,可以使用多个其他很棒的函数。

如果您想使用它,或以任何方式做出贡献(问题,提交等),请随时加入:

https://github.com/AlphabaseIT/CIconnect

答案 2 :(得分:0)

我最终创建了自己的集成,你可以从GitHub下载它: https://github.com/cworsley4/Codeigniter-with-Facebook